В качестве хобби / учебного проекта я пишу генератор парсеров на Python. Один из моих файлов кода называется «token.py», который содержит пару классов для преобразования простых строк в объекты Token. Я только что обнаружил, что использование функции «help ()» из консоли в Python вызывает ошибку для любого модуля, определенного в каталоге, который содержит «token.py».
Вот способ воспроизвести ошибку. Создайте новый каталог со следующими файлами:
/New Folder
main.py
token.py
Оставьте «token.py» пустым. В main.py напишите простую функцию - например:
def test():
pass
Затем в консоли Python импортируйте main и вызывайте help (main.test) - вот что вы получите:
C:\New Folder>python
Python 3.1.1 (r311:74483, Aug 17 2009, 17:02:12) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import main
>>> help(main.test)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python31\lib\site.py", line 428, in __call__
import pydoc
File "C:\Python31\lib\pydoc.py", line 55, in <module>
import sys, imp, os, re, inspect, builtins, pkgutil
File "C:\Python31\lib\inspect.py", line 40, in <module>
import tokenize
File "C:\Python31\lib\tokenize.py", line 37, in <module>
COMMENT = N_TOKENS
NameError: name 'N_TOKENS' is not defined
>>>
Если вы удалите файл «token.py», help () будет работать нормально. Как Python 3.1, так и Python 2.5 демонстрируют такое поведение.
Это известная проблема? Если нет, то как мне сообщить об этом?
EDIT:
В нескольких комментариях утверждается, что это поведение не является ошибкой. Модуль, который определяет «help», импортирует модуль под названием «token» из стандартной библиотеки Python. Тем не менее, Python ищет в папке приложения, прежде чем он ищет в своей библиотеке, чтобы найти модули. В приведенном выше примере «help» пытается использовать мой «token.py» вместо Python, что вызывает ошибку.
Поскольку Python определен, чтобы демонстрировать это поведение, я полагаю, что это не ошибка. Но почему люди думают, что это поведение приемлемо? Это означает, что добавление новых модулей в библиотеку Python - даже без изменения существующих модулей - может привести к поломке существующих приложений. Это также означает, что программисты, как ожидается, запомнят имена всех модулей в библиотеке Python - как это может быть менее смешно, чем ожидать, что программисты запомнят каждое пространство имен в .NET или Java? Почему приложения Python не получают свои собственные пространства имен? Почему модули стандартной библиотеки Python не находятся в своем собственном пространстве имен?