查看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 :(得分:7)
您正在查看的是仅在Python 3.8a1和更高版本中提供的源代码,请参见pull request that introduced this message in July 2018:
bpo-33305:针对无效的数字文字改进了SyntaxError。 (GH-6517)
和所附的Python issue #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
您在Python 3.7或更早版本上进行了尝试,因此仍看不到新消息。