Eri*_*got 10 python attributes syntax-error
在Python中,属性访问的语法有一个限制(至少在CPython 2.7.2实现中):
>>> class C(object): pass
>>> o = C()
>>> o.x = 123 # Works
>>> o.if = 123
o.if = 123
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
我的问题是双重的:
o.if = 123禁止使用Python关键字属性名称(如in )的根本原因?o.class = …在我的一个程序中,这样做是有道理的,而且我不能做到这一点有点失望(o.class_会起作用,但看起来并不那么简单).
PS:这个问题显然是if和class是Python的关键字.现在的问题是,为什么使用关键字作为属性名称将被禁止(我看不出在表达任何含糊之处o.class = 123),以及这是否证明.
因为当关键字总是关键字而不是上下文时,解析器更简单(例如,if当在语句级别时是一个关键字,但在表达式内只是一个标识符 - 因为if它是双重的X if C else Y,因为它for被用于列表推导和生成器表达式).
所以代码甚至没有达到属性访问的程度,它只是被解析器拒绝,就像错误的缩进一样(这就是为什么它是a SyntaxError,而不是AttributeError或者什么).它不区分您if是用作属性名称,变量名称,函数名称还是类型名称.它永远不会是一个标识符,只是因为解析器总是为它分配"关键字"标签并使其成为与标识符不同的标记.
它在大多数语言中都是一样的,语言语法(+ lexer规范)就是这方面的文档.语言规范明确提到它.它在Python 3中也没有变化.
另外,仅仅因为您可以使用setattr或__dict__创建具有保留名称的属性,并不意味着您应该这样做.不要强迫自己/ API用户使用getattr而不是自然属性访问.getattr应该在需要访问变量属性名时保留.