为什么属性名称不能是Python关键字?

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)

我的问题是双重的:

  1. 是否有o.if = 123禁止使用Python关键字属性名称(如in )的根本原因?
  2. 上述对属性名称的限制是在哪里记录的?

o.class = …在我的一个程序中,这样做是有道理的,而且我不能做到这一点有点失望(o.class_会起作用,但看起来并不那么简单).

PS:这个问题显然是ifclass是Python的关键字.现在的问题是,为什么使用关键字作为属性名称将被禁止(我看不出在表达任何含糊之处o.class = 123),以及这是否证明.

Cat*_*lus 8

因为当关键字总是关键字而不是上下文时,解析器更简单(例如,if当在语句级别时是一个关键字,但在表达式内只是一个标识符 - 因为if它是双重的X if C else Y,因为它for被用于列表推导和生成器表达式).

所以代码甚至没有达到属性访问的程度,它只是被解析器拒绝,就像错误的缩进一样(这就是为什么它是a SyntaxError,而不是AttributeError或者什么).它不区分您if是用作属性名称,变量名称,函数名称还是类型名称.它永远不会是一个标识符,只是因为解析器总是为它分配"关键字"标签并使其成为与标识符不同的标记.

它在大多数语言中都是一样的,语言语法(+ lexer规范)就是这方面的文档.语言规范明确提到它.它在Python 3中也没有变化.

另外,仅仅因为您可以使用setattr__dict__创建具有保留名称的属性,并不意味着您应该这样做.不要强迫自己/ API用户使用getattr而不是自然属性访问.getattr应该在需要访问变量属性名时保留.