gpt4 book ai didi

python - Python 中的 __build_class__ >= 3.5

转载 作者:行者123 更新时间:2023-12-05 06:12:52 25 4
gpt4 key购买 nike

我在较新版本的 Python 中手动构建类时遇到了麻烦。

class A:
x = 13
print(locals())

print(A.x)

def f():
__module__ = '__main__'
__qualname__ = 'B'
x = 13
print(locals())

B = __build_class__(f, 'B')
print(hasattr(B, 'x'))

# just for debugging
import inspect
import dis
dis.dis(inspect.currentframe().f_code)

字节码看起来大体相同,但B类最后没有属性x。我错过了什么吗?在旧版本中,我只需要返回一本字典,但它显然已经改变了。

最佳答案

问题解决了!

看起来问题出在 CO_NEWLOCAL 标志上。根据文档:

如果设置,执行代码对象时将为框架的 f_locals 创建一个新的字典。

听起来正是我不想发生的事情。查看 CPython 代码,在编译功能 block 时,只有一个地方设置了这个标志。所以,似乎没有任何功能在这里不起作用。 lambdas 也一样。但是 compile 内置函数呢?

>> compile('x = 99', '', 'exec').co_flags
64

宾果游戏!最后是这段代码解决了我的问题:

import types

class A:
x = 13

print(A.x)

f = types.FunctionType(compile('x = y', '', 'exec'), globals={'y': 13})

B = __build_class__(f, 'B')
print(B.x)

关于python - Python 中的 __build_class__ >= 3.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63536320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com