非';t有效的python标识符
通常的属性访问方法要求属性名为 但属性不必是有效的python标识符:非';t有效的python标识符,python,attributes,Python,Attributes,通常的属性访问方法要求属性名为 但属性不必是有效的python标识符: >>> class Thing: ... def __init__(self): ... setattr(self, '0potato', 123) ... >>> t = Thing() >>> Thing.__getattribute__(t, '0potato') 123 >>> getattr(t, '0
>>> 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保留关键字等的属性,真的有任何有效的用例吗?我认为原因是属性只是对象/名称空间dict中的键,但这毫无意义,因为不允许使用其他有效dict键的对象:
>>> setattr(t, ('tuple',), 321)
TypeError: attribute name must be string, not 'tuple'
因此,为了回答用例问题,从上面的注释中查看Python在引用中如何工作的背后的推理,我们可以推断出一些可能使这个Python怪癖有用的情况
为什么允许这样做的答案可以在@poke的答案中找到。我不认为你的问题应该被欺骗,因为它要求合法的用例,而另一个只问为什么允许这样做。洛维斯的回应是。因此,它主要取决于
\uuuu setattr\uuuu
的底层实现,该实现可能接受非标识符。尽管可以创建一个接受元组的\uuuu setattr\uuuu
,但通过setattr
调用时仍然失败。因此,内置方法似乎不仅仅是盲目地将其参数传递给对象的\uu setattr\uu
方法。