非本地人()在哪里?

2024-03-16

如何获取当前作用域的非局部变量?功能vars, locals, and globals存在,但是有没有一个函数可以获取nonlocals?

为什么打电话时没有列出外地人vars?

Update

我的问题是,无法枚举当前作用域中可用的变量,因为两者都没有vars or globals包括非本地人 AFAICT。

我经常使用vars代码如下:

'{meh[0]}/{meh[3]} {a}{b}{c}'.format(**vars())

如果这些变量中的任何一个位于包含函数的范围内,则会失败。


从正在运行的代码中,您可以轻松获取非局部变量的名称 - 但以调用的方式检索它们的内容locals给你一本字典有点棘手。

使用过的nonlocal变量名称存储在当前运行的代码对象的 co_freevars 属性中。

因此,获取非本地名称的问题是:

names = inspect.currentframe().f_code.co_freevars

The contents然而,这些变量存储在__closure__属性 (func_closure,在 Python 2) 中,函数对象反而。 (不是代码对象)。问题是,如果没有“外部的帮助”,正在运行的代码就没有简单的方法来访问它正在运行的函数对象。您可以访问框架对象,该对象链接到代码对象,但没有返回到函数对象的链接。 (对于顶级定义的函数,可以显式使用函数已知名称,如在def语句`,但对于返回给调用者的封闭函数,也无法知道其名称)。

因此,人们必须诉诸一种技巧 - 通过使用 gc 模块(垃圾收集器)获取链接到当前代码对象的所有对象 - 有一个gc.get_referrerscall - 它将返回链接到所持有的代码对象的所有函数对象。

因此,在具有非局部变量的函数内可以执行以下操作:

import inspect, gc

from types import FunctionType

def a(b):
    b1 = 2
    def c():
        nonlocal b1
        print (b)
        code =  inspect.currentframe().f_code  
        names = code.co_freevars
        function = [func for func in gc.get_referrers(code) if isinstance(func, FunctionType)][0]
        nonlocals = dict (zip(names, (x.cell_contents for x in function.__closure__ )))
        print(nonlocals)
        return inspect.currentframe()
    return c

c = a(5)
f = c()

因此检索非本地人的名称和值。But如果您有多个该函数的实例(也就是说,如果感兴趣的函数通过多次调用生成它的函数多次创建),那么这将不起作用 - 因为所有这些实例都会链接到same代码对象。上面的示例假设只有一个函数使用当前代码运行 - 并且在这种情况下可以正常工作。对工厂函数的另一次调用将创建另一个函数,其中非局部变量可能具有其他值,但具有相同的代码对象 -function = 上面的列表生成器将检索所有这些,并任意选择其中的第一个。

“正确”的函数是当前代码正在执行的函数 - 我试图想出一种检索此信息的方法,但无法找到它。如果可以的话,我将完成这个答案,但目前,这无法帮助您检索非本地值。

update但是,只需将“eval”与非局部变量名一起使用即可。它只需显式声明为非本地,或者按嵌套函数中的名称进行硬编码,以便实际创建闭包。

def blah():
    b = 1
    def bleh():
        nonlocals = sys._getframe().f_code.co_freevars
        print(f"{eval(nonlocals[0])=}")
        b  # b has to be "touched" so the closure is created.
    return ble

在发现简单的“eval”可以工作之前,我是这样离题的:

看起来,唯一将当前运行框架链接到保存非局部变量值的函数对象的东西是在运行时在 Python 解释器的本机端内创建的。我想不出除了使用 ctypes 模块在运行时查看解释器数据结构之外的方法,这当然不适合任何实际的生产代码。

底线:您可以可靠地检索非局部变量名称。但看起来您无法将其名称作为字符串获取它们的值(也无法重新绑定)。

您可以尝试在 Python 的错误跟踪器或 Python-ideas 邮件列表上打开“非本地”调用的功能请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

非本地人()在哪里? 的相关文章

  • Redis - 错误:值不是有效的浮点数

    我在 Redis 中有一个排序集 我试图通过在Python代码中使用zincrby来更新特定元素的计数器值 例如 conn zincrby usersSet float 1 user1 但它显示错误为 错误 值不是有效的浮点数 我在 cli
  • 不能在jinja2宏中使用current_user?

    我使用 Flask Login 它提供了current user模板中的对象 我想编写一个宏来显示评论表单或登录链接 具体取决于用户是否登录 如果我直接在模板中使用此代码 它会起作用 if current user is authentic
  • 在 MacOSX10.6 上运行 python 服务器时 MySQLdb 错误

    运行我的服务器 python manage py runserver 产生以下错误 django core exceptions ImproperlyConfigured 加载 MySQLdb 模块时出错 没有名为 MySQLdb 的模块
  • 如何使用 python 从嵌套表结构中识别最终父级?

    我有下表 我的问题是 我如何以编程方式识别最终父级 以下是通过示例解释的规则 the id 5 0的父母是51 0 身份证号51 0没有父母 因此 id5 0的最终父级是51 0 the id 6 0的父母是1 0 身份证号1 0的父母是1
  • pandas python 根据一个或多个其他列的子集更新 A 列的子集

    Edit我修改了下面的部分描述 以澄清 功能 和 组 的含义 修复拼写错误 并包含我尝试过的其他代码 我的熊猫df有 450 万行和 23 列 下表显示了几行df2这是从生成的df 它显示了两组 eeskin and hduquant 和三
  • PyQt4 信号和槽

    我正在使用 PyQt4 编写我的第一个 Python 应用程序 我有一个 MainWindow 和一个 Dialog 类 它是 MainWindow 类的一部分 self loginDialog LoginDialog 我使用插槽和信号 这
  • 使用 for 循环 Python 为数组赋值

    我正在尝试将字符串的值分配给不同的数组索引 但我收到一个名为 列表分配超出范围 的错误 uuidVal distVal uuidArray distArray for i in range len returnedList for beac
  • 插入多行并返回主键时 Sqlalchemy 的奇怪行为

    插入多行并返回主键时 我注意到一些奇怪的事情 如果我在 isert 查询中添加使用参数值 我会得到预期的行为 但是当将值传递给游标时 不会返回任何内容 这可能是一个错误还是我误解了什么 我的sqlachemy版本是0 9 4 下面如何重现错
  • 使用解析将 ** 运算符更改为幂函数?

    我的要求是将 运算符更改为幂函数 例如 1 Input B 2 Output power B 2 2 B 2 T 2 X Output power B 2 我写了下面的正则表达式来解决这个问题 rx r a zA Z0 9 a zA Z0
  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • 计算 for 循环期间的运行总计 - Python

    编辑 下面是我根据收到的反馈 答案编写的工作代码 这个问题源于我之前使用 MIT 的开放课件学习 Python CS 时提出的问题 在这里查看我之前的问题 https stackoverflow com questions 4990159
  • Django REST Framework:无法使用视图名称解析超链接关系的 URL

    我已经广泛研究了这个相当常见的问题 但没有一个修复对我有用 我正在 REST 框架中构建 Django 项目 并希望使用超链接关系 用户可以拥有许多独立的汽车和路线 路线是位置的集合 这些是我的序列化器 class CarSerialize
  • less.js - 在解析器回调中获取变量值

    我正在使用 less js 1 3 0 在客户端将 less 解析为 css 在解析器的回调中 我想获取每个变量的值 我尝试了以下方法但没有成功 var data colour red example background color co
  • 使用opencv+picamera流IO用树莓派捕获视频

    我使用 Raspberry 来简单地显示一个视频 目前仅此 为此 我必须使用 opencv cv2 我尝试了很多解决方案 但现在我想使用 Picamera 库捕获视频 我将向您展示我的代码 import io import time imp
  • Python3如何安装.ttf字体文件?

    我想使用 python3 更精确的 Python 3 6 代码在 Windows 10 上安装 ttf 字体文件 我用谷歌搜索 但我发现的唯一的就是这个使用python在windows上安装TTF字体 https stackoverflow
  • 如何在 sqlalchemy 中创建基于文字的查询?

    我创建了一个函数来创建表达式 def test operator1 operation operator2 return literal column operator1 op operation operator2 现在当我用 test
  • PyCharm 输出错误消息散布在控制台输出中。如何解决这个问题?

    我正在运行 PyCharm 社区版 4 0 4 有谁知道为什么控制台输出后不显示错误消息 Thanks C Python27 python exe F Google Drive code python scripts leetcode lc
  • 如何使用子进程打开新的浏览器选项卡?

    我正在打开一个新的 IE 窗口 subprocess Popen r os environ PROGRAMFILES Internet Explorer IEXPLORE EXE Call URL 当 IE 关闭时这很好 但即使打开它也会生
  • 使用多行选项和编码选项读取 CSV

    在 azure Databricks 中 当我使用以下命令读取 CSV 文件时multiline true and encoding SJIS 似乎编码选项被忽略了 如果我使用multiline选项 Spark 使用默认值encoding那
  • 使用 Tweepy 获取推文时出错

    我有一个用于获取推文的 Python 脚本 在脚本中我使用该库 Tweepy 我使用有效的身份验证参数 运行此脚本后 一些推文存储在我的 MongoDB 中 有些则被 if 语句拒绝 但我仍然收到错误 requests packages u

随机推荐

  • Angular 4 - 如何使垫卡填充整个父组件区域

    我有一个mat grid tile 父级 包含一个组件app window 子 其中包含mat card在其根源 The app window填充mat grid tile根据需要并且垂直和水平居中对齐 现在我想要app window s
  • 大气+弹簧+自动装配问题[重复]

    这个问题在这里已经有答案了 我正在开发一个网络应用程序并尝试集成聊天功能 目前 我正在使用 Spring 和 Atmosphere 来做到这一点 我设法让聊天正常进行 但现在我似乎遇到了问题 我在一个单独的 servlet 中使用 Mana
  • Google App Engine 提供 Content-Length 标头

    我使用以下内容通过 PHP App Engine 从 GS 提供文件 google appengine api cloud storage CloudStorageTools serve 这不会设置 Content Length 标头 并且
  • 将音频文件拆分为多个文件,每个文件都低于大小阈值

    我有一个 FLAC 文件 需要将其拆分为几个不同的 FLAC 文件 每个文件的大小必须低于 100 MB 有没有任何 UNIX 工具可以帮我做到这一点 我可以自己实现这个逻辑吗 旁注 由于 FLAC 是压缩的 我认为最简单的解决方案需要首先
  • 如何构建 py2exe 而不会出现错误?

    我通常不是 Windows 用户 但我需要从 python 代码构建 exe 所以我想使用 py2exe 来执行此操作 我有一个XP系统 我安装了python 2 6 6 我下载了 py2exe 0 6 9 源代码 但是当我尝试安装 通过
  • C++ 中的 4d 映射?

    你能告诉我如何编写多维地图吗 对于二维地图 我做了以下操作 map
  • Python 中是否有一个快速的 XML 解析器,允许我将标签的开头作为流中的字节偏移量?

    我正在处理可能巨大的 XML 文件 其中包含来自我的项目的复杂跟踪信息 我想为这些 XML 文件建立索引 以便可以快速找到 XML 文档的子部分 而不必将其全部加载到内存中 如果我创建了一个 搁置 索引 其中可能包含诸如 作者 Joe 的书
  • 如何了解 iOS 11 中设备屏幕是否正在录制

    我有一个应用程序 它具有受版权保护的内容 我不希望用户记录它 如果他们开始录制屏幕 我希望我的应用程序能够捕捉到这一点 如果正在录屏 用什么函数来捕捉 我不想阻止 我想理解并抓住它 注意 一些答案表示解决方案包括 AirPlay 和镜像 我
  • MySQL - 如何在存储过程中抛出异常?

    MySQL存储过程如何产生异常 例如 CREATE PROCEDURE SALES BEGIN STATEMENT STATEMENT STATEMENT IF PRICE gt 500 THEN THROWS AN EXCEPTION W
  • 从 PowerShell 向用户授予 SeServiceLogonRight

    在我当前正在编写的脚本中 我创建了一个专用用户来启动我们内部开发的一些 Windows 服务 为了启动这些服务 我们的 专用 用户需要 SeServiceLogonRight 权限 目前 我正在使用 ntrights exe 以及来自 Po
  • 如何标准化一个计数器并组合 2 个标准化计数器? - Python

    首先 我有两个字符串列表 abc abc def jkl abc def def pqr pr foo bar 然后我需要标准化列表的计数器 以便每个计数器中的值之和等于 1 Counter abc 0 8164965809277261 j
  • 隐藏运行时间较长的行宏

    有没有办法让这段代码运行得更快 我试图隐藏多个工作表中的空白行 Option Explicit Private Sub HideRows Click Dim ws As Worksheet c As Range Application Sc
  • 如何从R中的灰度图像中获取像素矩阵?

    当灰度图像由矩阵表示时 矩阵的每个元素决定相应像素的强度 为了方便起见 当前大多数数字文件使用 0 表示黑色 最小强度的颜色 和 255 表示白色 最大强度 之间的整数 总共给出 256 2 8 不同的灰度级 有没有办法获得R中灰度图像的像
  • 如何在新的EXCEL表格中写入数据

    I have Mysql procedure which will return 5 tables Now i need to set those tables to Single Excel files 5 different sheet
  • 如何提供可通过 asp.net 5 中的 ConfigurationManager 访问的设置?

    我如何提供可通过以下方式访问的设置ConfigurationManager在 ASP NET 5 中 我正在使用不支持新版本的旧软件包Microsoft Framework ConfigurationModel并希望通过 Configura
  • Oracle 相当于带有通配符的 patindex 和 instr 函数

    是否有一个相当于 Oracle 的patindex 从我的搜索来看 唯一接近的函数patindex是甲骨文的instr功能 但不支持通配符 以下查询的 Oracle 等效项是什么 select patindex 0 00194505022
  • 使用支持向量回归进行时间序列预测

    我一直在尝试使用Python语言中的支持向量回归来实现时间序列预测工具 我使用 scikit learn 中的 SVR 模块进行非线性支持向量回归 但我对未来事件的预测有严重的问题 回归线非常适合原始函数 根据已知数据 但一旦我想预测未来的
  • 使用 C++/STL 存储二进制数据的“正确”方式

    一般来说 在 C 中存储二进制数据的最佳方式是什么 据我所知 这些选项几乎可以归结为使用字符串或向量 我将省略 char 和 malloc 的可能性 因为我特指 C 通常我只使用一个字符串 但是我不确定是否缺少一些开销 或者 STL 内部进
  • 在 Django 中从基本模型实例转换为派生代理模型?

    我想为 Django 的默认 User 类定义一个代理模型 如下所示 class MyUser User def pretty username self if self first name return self first name
  • 非本地人()在哪里?

    如何获取当前作用域的非局部变量 功能vars locals and globals存在 但是有没有一个函数可以获取nonlocals 为什么打电话时没有列出外地人vars Update 我的问题是 无法枚举当前作用域中可用的变量 因为两者都