【发布时间】:2012-04-02 13:28:02
【问题描述】:
在 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和class是Python关键字。问题是为什么禁止使用关键字作为属性名称(我没有看到表达式o.class = 123 有任何歧义),以及这是否记录在案。 p>
【问题讨论】:
-
因为当关键字总是关键字而不是上下文时,解析器会更简单。所以代码甚至没有到达属性访问的地步,它只是解析级别的语法错误(因为
if是语法的一部分,它从未出现在这个地方)。大多数语言都是一样的,语言语法就是它的文档。 -
另外,
cls通常用于包含对类的引用的名称。 -
即使您有一个可以将关键字与变量/函数名称区分开来的解析器,也不能保证在极端情况下一个可能会影响另一个。如果你直接禁止使用几十个名字,那么保持理智会容易得多。
-
@CatPlusPlus:很好的答案。只是解析器效率的设计决策。 Python 成语是
if_、while_、exec_等,用于关键字名称冲突。_foo被认为是受保护属性的模式 -
@CatPlusPlus:回答,不评论。您实际上已经回答了它,而目前的答案根本没有回答。
标签: python attributes syntax-error