作为一个业余爱好/学习项目,我正在用Python编写一个解析器生成器.我的一个代码文件名为"token.py" - 它包含几个用于将纯字符串转换为Token对象的类.我刚刚发现在Python中使用控制台中的"help()"函数会在包含"token.py"的目录中定义的任何模块引发错误.
这是重现错误的方法.使用以下文件创建新目录:
/New Folder
main.py
token.py
Run Code Online (Sandbox Code Playgroud)
将'token.py'留空.在main.py中,编写一个简单的函数 - 例如:
def test():
pass
Run Code Online (Sandbox Code Playgroud)
然后,在你的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
>>>
Run Code Online (Sandbox Code Playgroud)
如果删除'token.py'文件,help()将正常运行.Python 3.1和Python 2.5都表现出这种行为.
这是一个已知的问题?如果没有,我该如何举报?
编辑:
几条评论声明这种行为不是一个错误.定义"help"的模块从Python的标准库中导入一个名为"token"的模块.但是,Python在应用程序文件夹中查找它的库以查找模块之前.在上面的示例中,"help"尝试使用我的"token.py"而不是Python,这会导致错误.
由于Python被定义为表现出这种行为,我认为它不是一个bug.但为什么人们认为这种行为是可以接受的呢?这意味着向Python库中添加新模块 - 即使不更改现有模块 - 也可能破坏现有应用程序.这也意味着程序员应该记住Python库中所有模块的名称 - 与期望程序员记住.NET或Java中的每个命名空间相比,这有多荒谬吗?为什么Python应用程序不能获得自己的命名空间?为什么Python标准库模块不在自己的命名空间中?
问题是你的本地token.py是由help()而不是Python的实际导入token.py.对于.py名称与内置模块发生冲突的任意数量的文件,都会发生这种情况.例如,尝试pydoc.py在CWD中创建文件,然后尝试help()使用Python.该help()函数只是一个内置的Python函数,因此它遵循与任何其他Python代码相同的导入路径.
| 归档时间: |
|
| 查看次数: |
496 次 |
| 最近记录: |