为什么类属性不能在 python 中命名为保留字?



在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关键字吗?很难说。

但这是不明智的imho:

>>> 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

为什么会有这种限制?我并不是孤立地使用保留字,而是作为一个类属性:一点也不含糊。蟒蛇为什么会关心那个?

这根本不值得。

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

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

Foo.for = 3

解析和

class Foo:
for = 3

引发SyntaxError。你会让Python变得不那么一致,更难学习,更难理解。

所有这些,你会得到。。。写入CCD_ 2的能力。我能说的最好的一点是,它可以防止像x.fibble = 3这样的东西在添加fibble关键字时中断,但即使这样,fibble的所有其他用途仍然会中断。不值得。如果你想使用疯狂的属性名称,你有setattrgetattr


Python尽最大努力简化语法。它的语法分析器是LL(1),LL(1"语法分析器的限制被认为是有益的,特别是因为它们可以防止使用疯狂的语法规则:

简单胜于复杂。这个想法扩展到了解析器。将Python的语法限制为LL(1)语法分析器是一件幸事,而不是一件坏事。它给我们戴上了手铐,防止我们走极端,最终使用时髦的语法规则,就像其他一些未命名的动态语言一样,比如Perl。

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

要了解这种限制背后的原因,您需要了解计算机语言是如何工作的。

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

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

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

简而言之,关键词的存在是为了赋予文本结构。如果没有结构,程序就不可能对文本进行确定性分析。如果你试图用一个关键字来表示其他内容,它会破坏结构。在对结构进行分析之后,就不再需要它们了。从本质上讲,这意味着一种语言的作者必须划清界限,保留一些单词用于结构,同时让程序员可以自由使用其他单词。

这不仅仅是Pyhthon特有的。每种语言都是一样的。如果你没有文本文件,你就不需要关键词。从技术上讲,一种语言有可能克服这一限制,但这会使事情复杂化,没有任何实际好处。将解析器与语言的其他部分分离是非常有意义的,以至于您不希望它以任何其他方式出现。

相关内容

  • 没有找到相关文章

最新更新