Кажется, что Python предоставляет два варианта своего лексера, один из которых используется внутри себя, когда сам Python анализирует файлы, и другой, который предоставляется Python, например, через __builtins__.compile
или tokenizer.generate_tokens
.Кажется, только первый проверяет наличие символов не ASCII.Он контролируется #ifdef PGEN
в Parser / tokenizer.c.
У меня есть точное предположение о том, почему они так поступили: в Python 3 не-ASCII-символы разрешены в файлах .py иинтерпретируется как UTF-8 IIRC.При тихом разрешении UTF-8 в лексере функция 2.7 tokenizer.generate_tokens()
может принимать весь действительный код Py3.