5

似乎保留字不能用作python中的属性:

$ python
Python 3.6.2 |Continuum Analytics, Inc.| (default, Jul 20 2017, 13:51:32) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
>>>     global = 3
  File "<stdin>", line 2
    global = 3
           ^
SyntaxError: invalid syntax

这似乎是明智的,因为它是模棱两可的:我在这里使用global关键字吗?很难说。

但这不是明智的恕我直言:

>>> class A: pass
>>> a = A()
>>> a.global = 3
  File "<stdin>", line 1
    a.global = 3
           ^
SyntaxError: invalid syntax
>>> a.def = 4
  File "<stdin>", line 1
    a.def = 4
        ^
SyntaxError: invalid syntax
>>> a.super = 5
>>> a.abs = 3
>>> a.set = 5
>>> a.False = 5
  File "<stdin>", line 1
    a.False = 5
          ^
SyntaxError: invalid syntax
>>> a.break = 5
  File "<stdin>", line 1
    a.break = 5
          ^
SyntaxError: invalid syntax

为什么会有这个限制?我不是单独使用保留字,而是作为一个类属性:完全没有歧义。为什么python会关心这个?

4

2 回答 2

10

这根本不值得。

当然,你可以允许。破解标记器和解析器,以便标记器知道解析上下文并在解析器期望属性访问时发出 NAME 标记而不是关键字标记,或者只是让它总是在 DOT 之后发出 NAME 标记而不是关键字。但这会给你带来什么?

您会使解析器和标记器更复杂,因此更容易出错。你会让人类读者更难阅读。你会限制未来的语法可能性。你会引起混乱

Foo.for = 3

解析和

class Foo:
    for = 3

抛出一个语法错误。你会让 Python 变得不那么一致,更难学习,也更难理解。

尽管如此,你会获得……写作的能力x.for = 3。我能说的最好的就是它可以防止x.fibble = 3在添加fibble关键字时破坏类似的东西,但即便如此,所有其他用途fibble仍然会破坏。不值得。如果你想使用疯狂的属性名称,你有setattrand getattr


Python 尽最大努力使语法简单。它的解析器是 LL(1),并且 LL(1) 解析器的限制被认为是有益的,因为它们可以防止过度使用疯狂的语法规则

简单胜于复杂。这个想法延伸到解析器。将 Python 的语法限制为 LL(1) 解析器是一种祝福,而不是一种诅咒。它给我们戴上了手铐,防止我们过度使用并最终得到时髦的语法规则,就像其他一些将不被命名的动态语言一样,比如 Perl。

类似的东西x.for = 3不符合那种设计理念。

于 2017-10-25T07:04:12.137 回答
1

要了解此限制背后的原因,您需要了解计算机语言的工作原理。

最初,您有一个文本文件。您将此文本提供给一个字符串标记器(称为词法分析器),它可以识别词法元素,例如单词、运算符、注释、数字、字符串等。基本上,词法分析器除了字符之外什么都不知道。它将文本文件转换为类型化标记流。

然后将此令牌流馈入解析器。解析器处理更高级别的构造,例如方法定义、类定义、导入语句等。例如,解析器知道函数定义以“def”开头,后跟某个名称(类型标识符的标记),然后是冒号,和一堆缩进的行。这意味着诸如“def”、“return”、“if”之类的一些词是为解析器保留的,因为它们是语言语法的一部分。

解析的结果是一个称为抽象语法树(AST)的数据结构。AST 直接对应文本文件的内容和结构。在 AST 中,没有关键字,因为它们已经达到了它们的目的。另一方面,标识符(变量和函数的名称等)被保留,因为编译器/解释器稍后需要它们。

简而言之,存在关键字以赋予文本结构。没有结构,程序就不可能确定性地分析文本。如果您尝试将关键字用于其他内容,则会破坏结构。分析完结构后,就不再需要它们了。本质上,这意味着语言的作者必须划清界限并为结构保留一些单词,同时让所有其他单词自由供程序员使用。

这不仅仅是 Python 特有的。每种语言都是一样的。如果您没有文本文件,则不需要关键字。从技术上讲,一种语言可以克服这个限制,但它会使事情复杂化很多而没有任何真正的好处。将解析器与其他语言分开非常有意义,以至于您根本不希望以其他方式使用它。

于 2017-10-25T07:08:54.053 回答