py_compile 中的编码与导入

encoding in py_compile vs import

当使用 py_compile.compile 编译具有非 ASCII 字符的 python 脚本时,它不会抱怨编码。但是当导入时给出 python 2.7

SyntaxError: Non-ASCII character '\xe2' in file

为什么会这样?使用 py_compile 导入和编译有什么区别?

似乎 Python 提供了其词法分析器的两种变体,一种在 Python 本身解析文件时在内部使用,另一种通过例如 Python 暴露给 Python __builtins__.compiletokenizer.generate_tokens。似乎只有前者检查非 ASCII 字符。它由 Parser/tokenizer.c.

中的 #ifdef PGEN 控制

我对他们为什么这样做有一个合格的猜测:在 Python3 中,.py 文件中允许使用非 ASCII 字符,并被解释为 utf-8 IIRC。通过在词法分析器中默默地允许 UTF-8,2.7 的 tokenizer.generate_tokens() 函数可以接受所有有效的 Py3 代码。