【问题标题】:Why doesn't the Python interpreter return the explicit SyntaxError message?为什么 Python 解释器不返回显式 SyntaxError 消息?
【发布时间】:2019-07-08 10:51:48
【问题描述】:

查看 CPython 的 tokenizer.c 时,分词器会返回特定的错误消息。

例如,您可以查看标记器尝试parse a decimal number 的部分。当尝试解析数字 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;
}

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

有没有办法从分词器中提取 SyntaxError 消息?

【问题讨论】:

  • 它返回0,而不是SyntaxError。消息被传递给syntaxerror
  • @Goyo;是的,没错。不过,它确实在其他地方返回 syntaxerror。查看Line 1453 并尝试在您的解释器中编译“0xk”行。它返回 syntaxerror 并带有正确的错误消息,但您无法在解释器中提取它。
  • @Goyo:分词器在分词器状态上设置了一个异常,这会导致引发语法错误异常。

标签: python cpython python-internals


【解决方案1】:

您正在查看仅存在于 Python 3.8a1 和更高版本中的源代码,请参阅pull request that introduced this message in July 2018

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

以及附件Python issue #33305

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

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

您在 Python 3.7 或更早版本上尝试过此操作,因此还看不到较新的消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 2010-12-01
    • 2010-11-05
    • 2019-07-01
    • 2013-04-15
    相关资源
    最近更新 更多