作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在较新版本的 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/
在 Python 3.1 中,builtins 模块中有一个我不知道的新内置函数: __build_class__(...) __build_class__(func, name, *base
我在较新版本的 Python 中手动构建类时遇到了麻烦。 class A: x = 13 print(locals()) print(A.x) def f(): __module__ =
我正在尝试使用 Python 3.5 C API执行一些包括构造类的代码。具体来说是这样的: class MyClass: def test(self): print('tes
我是一名优秀的程序员,十分优秀!