作为一个爱好/学习项目,我正在用 Python 编写一个解析器生成器。我的一个代码文件名为“token.py”,其中包含几个用于将纯字符串转换为 Token 对象的类。我刚刚发现,在 Python 中使用控制台中的“help()”函数会对包含“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”的模块从Python的标准库导入一个名为“token”的模块。但是,Python 在查找其库以查找模块之前会先查找应用程序文件夹。在上面的示例中,“help”尝试使用我的“token.py”而不是 Python 的,这会导致错误。
由于 Python 被定义为表现出这种行为,我认为这不是一个错误。但为什么人们认为这种行为是可以接受的呢?这意味着向 Python 库添加新模块(即使不更改现有模块)也可能会破坏现有应用程序。它还意味着程序员应该记住 Python 库中所有模块的名称 - 这怎么比期望程序员记住 .NET 或 Java 中的每个命名空间更荒谬呢?为什么 Python 应用程序没有自己的命名空间?为什么 Python 标准库模块不在自己的命名空间中?