print的特殊异常消息用作as语句而不是as function,实际上是作为一个特殊情况实现的。在
粗略地说,当创建SyntaxError时,它调用一个特殊函数,根据异常引用的行检查print语句。在static int
_report_missing_parentheses(PySyntaxErrorObject *self)
{
Py_UCS4 left_paren = 40;
Py_ssize_t left_paren_index;
Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
int legacy_check_result = 0;
/* Skip entirely if there is an opening parenthesis
left_paren_index = PyUnicode_FindChar(self->text, left_paren,
0, text_len, 1);
if (left_paren_index <-1) {
return -1;
}
if (left_paren_index !&#61; -1) {
/* Use default error message for any line with an opening parenthesis
return 0;
}
/* Handle the simple statement case */
legacy_check_result &#61; _check_for_legacy_statements(self, 0);
if (legacy_check_result <0) {
return -1;
}
if (legacy_check_result &#61;&#61; 0) {
/* Handle the one-line complex statement case */
Py_UCS4 colon &#61; 58;
Py_ssize_t colon_index;
colon_index &#61; PyUnicode_FindChar(self->text, colon,
0, text_len, 1);
if (colon_index <-1) {
return -1;
}
if (colon_index >&#61; 0 && colon_index /* Check again, starting from just after the colon */
if (_check_for_legacy_statements(self, colon_index&#43;1) <0) {
return -1;
}
}
}
return 0;
}
这意味着如果行中有任何左括号&#xff0c;它将不会触发“缺少括号”消息。这会导致一般的SyntaxError消息&#xff0c;即使左括号在注释中&#xff1a;
^{2}$
请注意&#xff0c;用空格分隔的两个名称/变量的光标位置始终是第二个名称的结尾&#xff1a;>>> 10 100
10 100
^
SyntaxError: invalid syntax
>>> name1 name2
name1 name2
^
SyntaxError: invalid syntax
>>> name1 name2([1, 2])
name1 name2([1, 2])
^
SyntaxError: invalid syntax
因此&#xff0c;光标指向max的x&#xff0c;因为它是第二个名称中的最后一个字符。第二个名称后面的所有内容(如.&#xff0c;(&#xff0c;[&#xff0c;…)都将被忽略&#xff0c;因为Python已经找到了一个SyntaxError&#xff0c;它不需要进一步&#xff0c;因为没有任何东西可以使它成为有效的语法。在