【发布时间】:2014-10-23 18:15:40
【问题描述】:
属性访问的常用方法要求属性名称为valid python identifiers。
但属性不必是有效的 Python 标识符:
>>> class Thing:
... def __init__(self):
... setattr(self, '0potato', 123)
...
>>> t = Thing()
>>> Thing.__getattribute__(t, '0potato')
123
>>> getattr(t, '0potato')
123
当然,t.0potato 仍然是 SyntaxError,但属性仍然存在:
>>> vars(t)
{'0potato': 123}
允许这样做的原因是什么?对于带有空格、空字符串、python 保留关键字等的属性,真的有任何有效的用例吗?我认为原因是属性只是对象/命名空间字典中的键,但这没有意义,因为不允许其他作为有效字典键的对象:
>>> setattr(t, ('tuple',), 321)
TypeError: attribute name must be string, not 'tuple'
【问题讨论】:
-
为什么允许这样做的答案可以在@poke 的答案here 中找到。我不认为你的问题应该被欺骗,因为它要求合法的用例,而另一个只问为什么允许这样做。
-
首先请参阅 Martin v. Löwis 在Python Issue 14029 中的回复。所以它主要取决于
__setattr__的底层实现,它可以接受非标识符。尽管如此,尽管可以创建一个接受元组的__setattr__,但在通过setattr调用时仍然失败。因此,似乎内置方法不只是盲目地将其参数传递给对象的__setattr__方法。 -
这是Guido van Rossum considering你的问题。
标签: python attributes