Python中的__peg_parser__是什么?

61

我正在使用内置模块keyword来获取当前Python版本的所有关键字列表。以下是我的做法:

>>> import keyword
>>> print(keyword.kwlist)
['False', 'None', 'True', '__peg_parser__', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

keyword.kwlist 列表中有一个叫做 __peg_parser__ 的关键字。为了了解它的作用,我在 Windows 上的 Python 3.9 解释器中输入 __peg_parser__(在 Mac OS 和 Linux 上也是一样),得到以下输出:

>>> __peg_parser__
  File "<stdin>", line 1
    __peg_parser__
    ^
SyntaxError: You found it!

我的问题是,__peg_parser__是什么,为什么会出现SyntaxError: You found it!


1
你尝试过阅读这个吗:https://bugs.python.org/issue40939我认为这是一个旧功能,但我无法理解那里的信息。 - dee cue
1
@deecue 谢谢你提供的链接,看起来这是 Python 3.10 中将要更改的彩蛋。 - Abhigyan Jaiswal
4个回答

38

15

Guido在github上发布了新的PEG解析器,链接在这里

它也在Python PEP中提到:

本PEP建议使用基于PEG的新解析器替换CPython的当前LL(1)解析器。这个新的解析器将允许消除当前语法中存在的多个“hack”以规避LL(1)限制。它将大大降低与编译流程相关的某些领域(如语法、解析器和AST生成)的维护成本。新的PEG解析器还将消除当前Python语法上的LL(1)限制。

Python 3.9新特性页面中也有提到。

Python 3.10将删除LL(1)解析器。Python 3.9使用基于PEG而不是LL(1)的新解析器。

在Python 3.6中未定义:

>>> __peg_parser__
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    __peg_parser__
NameError: name '__peg_parser__' is not defined
>>> 

11

什么是__peg_parser__

__peg_parser__是Python的复活节彩蛋(属于Peg Parser),当新的Peg Parser发布时添加。如discussion中所述,它将在Python 3.10中被移除。

复活节彩蛋最初被称为__new_parser__,但根据message中的说明已更改为__peg_parser__,以使其具有未来兼容性:

newexng都不是真正具有未来兼容性的名称。我们可以将关键字重命名为__peg_parser__吗?

为什么会出现SyntaxError: You found it!

由于它是复活节彩蛋的一部分,因此会出现SyntaxError: You found it!

它将来会被移除吗?

由于LL(1) parser将被新的Peg Parser取代,因此它将在Python 3.10中被移除。

在较早和较新版本的Python中的__peg_parser__

它不存在于较早版本的Python中。

Python 3.8及更早版本:

>>> __peg_parser__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__peg_parser__' is not defined

Python 3.9:
>>> __peg_parser__
  File "<stdin>", line 1
    __peg_parser__
    ^
SyntaxError: You found it!

Python 3.10:

>>> __peg_parser__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__peg_parser__' is not defined

@ppwater 我认为只有Python 3.9。 - Abhigyan Jaiswal

2
本提案建议用新的基于PEG的解析器替换CPython当前的LL(1)解析器。这个新的解析器将允许消除当前语法中存在的多个“hack”以规避LL(1)限制。它将大大减少与编译流程相关的某些领域(如语法、解析器和AST生成)的维护成本。新的PEG解析器还将解除当前Python语法的LL(1)限制。
更多信息请阅读

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接