Python中的peg解析器是什么?

Python中的peg解析器是什么?,python,python-3.x,python-3.9,Python,Python 3.x,Python 3.9,我使用内置模块获取当前Python版本的所有关键字的列表。这就是我所做的: >>> import keyword >>> print(keyword.kwlist) ['False', 'None', 'True', '__peg_parser__', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'exc

我使用内置模块获取当前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']
列表中有
\uuupeg\uparser\uuuu
。为了查看它的功能,我在Windows上的Python 3.9解释器中键入了
\uuuu peg\u parser\uuuu
,如下所示:

>>> __peg_parser__
  File "<stdin>", line 1
    __peg_parser__
    ^
SyntaxError: You found it!
>>\uuu peg\u解析器__
文件“”,第1行
__peg_解析器__
^
SyntaxError:你找到了!

所以我的问题是,什么是
\uu peg\u parser\uu
,为什么我会得到
语法错误:你找到了

这是一个复活节彩蛋,与新产品的推出有关。复活节彩蛋,以及旧的LL(1)解析器。

什么是
\uuu peg\uu parser\uu
? 这是Python中的复活节彩蛋,用于纪念新版本发布的时间。如本文所述,它将在Python3.10中删除

在复活节彩蛋被称为
\uuuuu new\u parser\uuuuuuuu
之前,它被改为
\uuuuuuu peg\u parser\uuuuuuuuu
,以使其成为未来的证据,如下所述:

new
ex
ng
都不是真正经得起未来考验的名字。我们可以将关键字重命名为
\uuu peg\u parser\uuu

你为什么得到Syntaxer:你找到了? 你得到了
SyntaxError:你找到了
它将来会被移除吗?
由于将被替换为新的,因此将在Python3.10中删除它

在早期和更高版本的Python中 它在早期版本的Python中不存在

Python 3.8及更早版本:

>>\uuu peg\u解析器__
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“\uuuu peg\u parser\uuuuuu”
Python 3.9:

>>\uuu peg\u解析器__
文件“”,第1行
__peg_解析器__
^
SyntaxError:你找到了!
Python 3.10:

>>\uuu peg\u解析器__
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“\uuuu peg\u parser\uuuuuu”
github上发布的用于新PEG解析器的Guido

它也在播放

正如它提到的:


这个PEP建议用一个新的基于PEG的解析器替换当前基于LL(1)的CPython解析器。这个新的解析器将允许消除当前语法中存在的多个“hack”,从而绕过LL(1)限制。它将大大降低与编译管道相关的某些领域的维护成本,如语法、解析器和AST生成。新的PEG解析器还将取消对当前Python语法的LL(1)限制

第页也提到了

在Python3.10中,将删除
LL(1)
解析器。Python3.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
>>> 
>>\uuu peg\u解析器__
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
__peg_解析器__
NameError:未定义名称“\uuuu peg\u parser\uuuuuu”
>>> 

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


您是否尝试过阅读此内容:我认为这是一个旧功能,但我无法消化其中的信息。@deecue感谢您提供的链接,它似乎是一个复活节彩蛋,将在Python 3.10中更改,但在Python 3.8中也不起作用。@pp我认为只有Python 3.9可以