我很难理解为什么属性,例如
中的attr
obj.attr
存储在函数对象的co_names
内,而不是co_consts
:
In [1]: import numpy
In [2]: def f():
...: return numpy.array
In [4]: f.__code__.co_names
Out[4]: ('numpy', 'array')
In [5]: from dis import dis
In [7]: dis(f)
2 0 LOAD_GLOBAL 0 (numpy)
3 LOAD_ATTR 1 (array)
6 RETURN_VALUE
背后有什么逻辑吗?我没有看到函数中使用的全局符号与特定对象的属性名称有任何相似之处。由于属性查找在Python中是动态的,因此将属性存储为字符串常量将是更合理的IMO。
相关问题:
Why does python VM have co_names instead of just using co_consts?