Python 中对属性访问的语法有限制(至少在 CPython 2.7.2 实现中):
>>> class C(object): pass
>>> o = C()
>>> o.x = 123 # Works
>>> o.if = 123
o.if = 123
^
SyntaxError: invalid syntax
我的问题有两个:
- 使用 Python 关键字属性名称是否有根本原因(如
o.if = 123
) 是禁止的?
- 上述对属性名称的限制是否/在哪里记录?
这样做是有意义的o.class = …
,在我的一个程序中,我对无法做到这一点感到有点失望(o.class_
可以,但看起来并不那么简单)。
PS: 问题很明显if
and class
是Python关键字。问题是why使用关键字作为属性名称将被禁止(我没有看到表达式中有任何歧义o.class = 123
),以及这是否是记录在案.
因为当关键字始终是关键字而不是上下文时,解析器会更简单(例如if
在语句级别时是关键字,但在表达式内部时只是标识符 - forif
这会加倍困难,因为X if C else Y
, and for
用于列表推导式和生成器表达式)。
因此,代码甚至没有达到属性访问的程度,它只是被解析器拒绝,就像不正确的缩进一样(这就是为什么它是一个SyntaxError
, 并不是AttributeError
或者其他的东西)。它并不区分你是否使用if
作为属性名称、变量名称、函数名称或类型名称。它永远不可能是标识符,因为解析器总是为其分配“关键字”标签,并使其成为与标识符不同的标记。
大多数语言都是一样的,语言语法(+词法分析器规范)就是相关的文档。语言规范明确提到了它 http://docs.python.org/reference/lexical_analysis.html#identifiers。它在 Python 3 中也没有改变。
另外,仅仅因为您可以使用setattr
or __dict__
使用保留名称创建属性并不意味着您should。不要强迫自己/API用户使用getattr
而不是自然的属性访问。getattr
应该在需要访问变量属性名称时保留。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)