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__.compile
或 tokenizer.generate_tokens
。似乎只有前者检查非 ASCII 字符。它由 Parser/tokenizer.c.
中的 #ifdef PGEN
控制
我对他们为什么这样做有一个合格的猜测:在 Python3 中,.py 文件中允许使用非 ASCII 字符,并被解释为 utf-8 IIRC。通过在词法分析器中默默地允许 UTF-8,2.7 的 tokenizer.generate_tokens()
函数可以接受所有有效的 Py3 代码。
当使用 py_compile.compile 编译具有非 ASCII 字符的 python 脚本时,它不会抱怨编码。但是当导入时给出 python 2.7
SyntaxError: Non-ASCII character '\xe2' in file
为什么会这样?使用 py_compile 导入和编译有什么区别?
似乎 Python 提供了其词法分析器的两种变体,一种在 Python 本身解析文件时在内部使用,另一种通过例如 Python 暴露给 Python __builtins__.compile
或 tokenizer.generate_tokens
。似乎只有前者检查非 ASCII 字符。它由 Parser/tokenizer.c.
#ifdef PGEN
控制
我对他们为什么这样做有一个合格的猜测:在 Python3 中,.py 文件中允许使用非 ASCII 字符,并被解释为 utf-8 IIRC。通过在词法分析器中默默地允许 UTF-8,2.7 的 tokenizer.generate_tokens()
函数可以接受所有有效的 Py3 代码。