Skip to main content
 首页 » 编程设计

python之为什么 token.py 的存在会导致内置 help() 中断

2025年05月04日11dyllove98

作为一个业余爱好/学习项目,我正在用 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 都表现出这种行为。

这是一个已知问题吗?如果没有,我该如何举报?

编辑:

一些评论指出此行为不是错误。定义“help”的模块从 Python 的标准库中导入一个名为“token”的模块。但是,Python 在查找其库以查找模块之前先查找应用程序文件夹。在上面的示例中,“help”尝试使用我的“token.py”而不是 Python 的,这导致了错误。

由于 Python 被定义为表现出这种行为,我想这不是错误。但为什么人们认为这种行为是可以接受的呢?这意味着向 Python 库中添加新模块——即使不更改现有模块——也可能会破坏现有应用程序。这也意味着程序员应该记住 Python 库中所有模块的名称——这比期望程序员记住 .NET 或 Java 中的每个命名空间有什么可笑的呢?为什么 Python 应用程序没有自己的命名空间?为什么 Python 标准库模块不在它们自己的命名空间中?