来自 locals() 的 Python getattr 因 AttributeError 失败

Gon*_*ync -1 python getattr

希望这不是深夜效应,但我被一个非常简单的问题难住了:

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")
Run Code Online (Sandbox Code Playgroud)

输出按预期给出 locals() dict 项目:

v0 测试0
v3
测试3 v1 测试1
v2测试2

但随后死亡:

AttributeError: 'dict' 对象没有属性 'v1'

V1明显地在局部变量()“字典”,每初始输出,但随后GETATTR()否则坚持。

这是我第一次需要使用 locals(),但我能找到的每一份文档都表明这应该有效。我错过了什么?

编辑/更新:非常感谢@martijn 在下面的回答。我设法通过将局部变量暂时分配给一个虚拟类来在 getattr() 中使用动态局部变量:

class Attr:
    pass

def test_getattr(v0):
    A = Attr()
    A.v1 = "test1"
    #etc

    print(getattr(A, "v1"))
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

getattr()检索attributes,而不是字典键,并且字典键不是属性。locals()只是另一本字典,所以将其用作

print(locals()['v1'])
Run Code Online (Sandbox Code Playgroud)

否则,您只能在 上找到普通的字典属性locals(),例如keysanditems__len__and __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>
Run Code Online (Sandbox Code Playgroud)