非本地人()在哪里?

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(使用前将#替换为@)

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

随机推荐

  • 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 我的问题是 无法枚举当前作用域中可用的变量 因为两者都