为什么 Python 解释器 return 没有明确的 SyntaxError 消息?
Why doesn't the Python interpreter return the explicit SyntaxError message?
查看 CPython 的 tokenizer.c
时,分词器 return 的特定错误消息。
例如,您可以查看分词器尝试 parse a decimal number 的部分。当试图解析数字 5_6
时,一切都应该没问题,但是当试图解析数字 5__6
时,分词器应该 return 一个带有消息 "invalid decimal literal":[=20 的 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 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 或更早版本上试用过此功能,因此还不会看到更新的消息。
查看 CPython 的 tokenizer.c
时,分词器 return 的特定错误消息。
例如,您可以查看分词器尝试 parse a decimal number 的部分。当试图解析数字 5_6
时,一切都应该没问题,但是当试图解析数字 5__6
时,分词器应该 return 一个带有消息 "invalid decimal literal":[=20 的 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 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 或更早版本上试用过此功能,因此还不会看到更新的消息。