【发布时间】:2010-01-23 01:39:20
【问题描述】:
作为一个爱好/学习项目,我正在用 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 都表现出这种行为。
这是一个已知问题吗?如果没有,我该如何举报?
编辑:
几个 cmets 声明此行为不是错误。定义“帮助”的模块从 Python 的标准库中导入一个名为“令牌”的模块。但是,Python 会先在应用程序文件夹中查找,然后再在其库中查找模块。在上面的示例中,“帮助”尝试使用我的“token.py”而不是 Python 的,这会导致错误。
由于 Python 被定义为表现出这种行为,我想这不是一个错误。但是为什么人们认为这种行为是可以接受的呢?这意味着向 Python 库添加新模块——即使不更改现有模块——也可能会破坏现有应用程序。这也意味着程序员应该记住 Python 库中所有模块的名称——这比期望程序员记住 .NET 或 Java 中的每个命名空间更荒谬吗?为什么 Python 应用程序没有自己的命名空间?为什么 Python 标准库模块不在自己的命名空间中?
【问题讨论】:
标签: python namespaces