Python 来自 locals() 的 getattr 失败并出现 AttributeError
Python getattr from locals() fails with AttributeError
希望这不是深夜效应,但我被一个非常简单的问题难住了:
def test_getattr(v0):
v1 = "test1"
v2 = "test2"
v3 = "test3"
for k, v in locals().items():
print(k, v)
print(getattr(locals(), 'v1'))
test_getattr("test0")
输出按预期给出了 locals() 字典项:
v0 test0
v3 test3
v1 test1
v2 test2
但随后死于:
AttributeError: 'dict' object has no attribute 'v1'
根据初始输出,v1 显然 是 在 locals() 'dict' 中,但是 getattr() 坚持不这样做。
这是我第一次需要使用 locals(),但我能找到的所有文档都表明这应该可行。我错过了什么?
Edit/Update:非常感谢@martijn 的回答。我设法通过将局部变量暂时分配给虚拟 class:
在 getattr() 中使用动态局部变量
class Attr:
pass
def test_getattr(v0):
A = Attr()
A.v1 = "test1"
#etc
print(getattr(A, "v1"))
getattr()
检索 属性 ,而不是字典键,字典键是 不是 属性。 locals()
只是另一本词典,所以 将其用作一个:
print(locals()['v1'])
否则您只能在 locals()
上找到普通字典属性,例如 keys
和 items
以及 __len__
和 __getitem__
:
>>> type(locals())
<type 'dict'>
>>> dir(locals())
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']
>>> getattr(locals(), 'keys')
<built-in method keys of dict object at 0x10028f168>
希望这不是深夜效应,但我被一个非常简单的问题难住了:
def test_getattr(v0):
v1 = "test1"
v2 = "test2"
v3 = "test3"
for k, v in locals().items():
print(k, v)
print(getattr(locals(), 'v1'))
test_getattr("test0")
输出按预期给出了 locals() 字典项:
v0 test0
v3 test3
v1 test1
v2 test2
但随后死于:
根据初始输出,AttributeError: 'dict' object has no attribute 'v1'
v1 显然 是 在 locals() 'dict' 中,但是 getattr() 坚持不这样做。
这是我第一次需要使用 locals(),但我能找到的所有文档都表明这应该可行。我错过了什么?
Edit/Update:非常感谢@martijn 的回答。我设法通过将局部变量暂时分配给虚拟 class:
在 getattr() 中使用动态局部变量class Attr:
pass
def test_getattr(v0):
A = Attr()
A.v1 = "test1"
#etc
print(getattr(A, "v1"))
getattr()
检索 属性 ,而不是字典键,字典键是 不是 属性。 locals()
只是另一本词典,所以 将其用作一个:
print(locals()['v1'])
否则您只能在 locals()
上找到普通字典属性,例如 keys
和 items
以及 __len__
和 __getitem__
:
>>> type(locals())
<type 'dict'>
>>> dir(locals())
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']
>>> getattr(locals(), 'keys')
<built-in method keys of dict object at 0x10028f168>