python - 为什么 Python 解释器不返回明确的 SyntaxError 消息?

标签 python cpython python-internals

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

例如,您可以看一下分词器尝试 parse a decimal number 的部分.当尝试解析数字 5_6 时,一切都应该没问题,但是当尝试解析数字 5__6 时,tokenizer 应该返回一个带有消息“无效的十进制文字”的 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 消息吗?

最佳答案

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

bpo-33305: Improve SyntaxError for invalid numerical literals. (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 或更早版本上尝试过此操作,因此还不会看到更新的消息。

关于python - 为什么 Python 解释器不返回明确的 SyntaxError 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56933357/

相关文章:

python - 如何根据每行的多个最大值更新矩阵?

python - DFS打印python中字符串的所有排列

Python hasattr 与 getattr

python - 切片 `a`(例如 `a[1:] == a[:-1]`)是否创建 `a` 的副本?

python - 访问正在创建的对象分配给的名称

python - 为什么 Python 在使用 from-import 时对循环导入更加严格?

python - 如何在 api.py 中获取一些(自定义)用户数据?

python - 'unicode'和 'encode'有什么关系

python - 在列表末尾插入是否具有 O(1) 时间复杂度?

python - 为什么 Python 的 'len' 函数比 __len__ 方法快?