为什么Python解释器不返回显式的SyntaxError消息?

Inf*_*ity 2 python cpython python-internals

当查看CPython时tokenizer.c,令牌生成器返回特定的错误消息。

例如,您可以看一下分词器尝试解析十进制数的部分。尝试解析该数字时,5_6一切都应该正常,但是当尝试解析该数字时5__6,令牌生成器应返回SyntaxError并显示消息“无效的十进制文字”:

static int
tok_decimal_tail(struct tok_state *tok)
{
    int c;

    while (1) {
        do {
            c = tok_nextc(tok);
        } while (isdigit(c));
        if (c != '_') {
            break;
        }
        c = tok_nextc(tok);
        if (!isdigit(c)) {
            tok_backup(tok, c);
            syntaxerror(tok, "invalid decimal literal");
            return 0;
        }
    }
    return c;
}
Run Code Online (Sandbox Code Playgroud)

使用Python,我尝试达到令牌生成器的SyntaxError消息:

In [12]: try: 
    ...:     eval('5__6') 
    ...: except SyntaxError as e: 
    ...:     print(e.args, e.filename, e.lineno, e.msg, e.text) 

('invalid token', ('<string>', 1, 2, '5__6')) <string> 1 invalid token 5__6
Run Code Online (Sandbox Code Playgroud)

有什么方法可以从令牌生成器中提取SyntaxError消息?

Mar*_*ers 7

您正在查看仅在Python 3.8a1和更高版本中存在的源代码,请参阅在2018年7月引入此消息的请求请求

bpo-33305:针对无效的数字文字改进了SyntaxError。(GH-6517)

以及随附的Python问题#33305

当我使用Python 3.8b2(当前beta)运行您的代码时,我看到了您期望的消息:

>>> import sys
>>> sys.version_info
sys.version_info(major=3, minor=8, micro=0, releaselevel='beta', serial=2)    
>>> try:
...     eval('5__6')
... except SyntaxError as e:
...     print(e.args, e.filename, e.lineno, e.msg, e.text)
...
('invalid decimal literal',) <string> 1 invalid decimal literal None
Run Code Online (Sandbox Code Playgroud)

您在Python 3.7或更早版本上进行了尝试,因此将看不到更新的消息。