当前位置: 首页 > 面试题库 >

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

梁丘赞
2023-03-14
问题内容

在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),以及是否对此进行了 记录


问题答案:

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

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

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

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



 类似资料:
  • 问题内容: 我刚刚开始学习Python,并在Python中遇到了 “命名空间” 概念。虽然我了解了它的本质,但无法理解这个概念的严重性。 网上的一些浏览显示,反对PHP的原因之一是它没有对名称空间的本地支持。 有人可以解释如何使用名称空间以及此功能如何使编程更好 (不只是在Python中,因为我假设名称空间的概念不限于特定语言)。 我主要来自Java和C编程背景。 问题答案: 命名空间是一种实现范

  • 根据OWL 2中对称和非对称属性的定义以及子属性对属性特征继承的解释,我假设将非对称属性声明为对称属性的子属性将导致推理者检测到的不一致性(HermiT 1.3.8.413),但Protégé5.2.0的情况并非如此。对此有何解释? HermiT从下面的断言中正确推断出的范围为和,并在时检测到不一致。Protégé5.2.0中的Pellet和Fact 1.6.5也是如此。 这段代码似乎是文本的一种

  • Python @classmethod 为什么不能调用 @property 装饰的属性 ? AttributeError: 'property' object has no attribute 依然不是没清楚

  • 问题内容: (用Python shell编写) 为什么不允许对象向其添加属性? 问题答案: 请注意,实例没有属性: 一个在派生类中说明此行为的示例: 引用以下文档: […]声明采用一系列实例变量,并在每个实例中仅保留足够的空间来为每个变量保存一个值。因为未为每个实例创建空间,所以节省了空间。 编辑:要从评论中回答ThomasH,OP的测试类是“旧式”类。尝试: 您会注意到有一个实例。对象类可能没有

  • 我理解这是指当前对象。所以,与其使用 为什么我不能使用 请参考下面的例子,并在最后看到最后两个评论。

  • 和 元名称和元属性有什么区别?