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

发布于 2021-01-29 18:43:21

在Python中(至少在CPython 2.7.2实现中)属性访问的语法受到限制:

>>> class C(object): pass
>>> o = C()
>>> o.x = 123  # Works
>>> o.if = 123
    o.if = 123
       ^
SyntaxError: invalid syntax

我的问题是双重的:

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

o.class = …在我的一个程序中这样做是很有意义的,而我对无法做到这一点感到有点失望(o.class_可以工作,但看起来并不那么简单)。

PS :问题显然是,if并且class是Python关键字。问题是, 为什么
禁止使用关键字作为属性名称(我在表达式中看不出任何歧义o.class = 123),以及是否对此进行了 记录

关注者
0
被浏览
158
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    因为当关键字始终是关键字而不是上下文时,解析器更简单(例如if,在语句级别时是关键字,而在表达式内部时只是标识符),if因为,它会倍加辛苦X if C else Y,并且for用于列表推导和生成器表达式)。

    因此,代码甚至没有达到属性访问的地步,只是被解析器拒绝,就像不正确的缩进一样(这就是为什么它是一个SyntaxError,而不是AttributeError某个东西)。区分使用if属性名称,变量名称,函数名称还是类型名称都没有区别。它永远不能是标识符,仅因为解析器总是为其分配“关键字”标签,并使它与标识符不同的标记。

    大多数语言都是相同的,语言语法(+词法分析器规范)是该文档。语言规范明确提到了它。在Python
    3中也不会改变。

    另外,仅因为您可以使用setattr或使用__dict__保留名称来创建属性,并不意味着您 应该这样做 。不要强迫自己/
    API用户使用,getattr而不要使用自然属性访问。getattr当需要访问变量属性名称时应保留。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看