如何使用Python的'help()'函数报告错误?

Cyb*_*bis 1 python namespaces

作为一个业余爱好/学习项目,我正在用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标准库模块不在自己的命名空间中?

ezo*_*zod 5

问题是你的本地token.py是由help()而不是Python的实际导入token.py.对于.py名称与内置模块发生冲突的任意数量的文件,都会发生这种情况.例如,尝试pydoc.py在CWD中创建文件,然后尝试help()使用Python.该help()函数只是一个内置的Python函数,因此它遵循与任何其他Python代码相同的导入路径.

  • 进程中 Python 的每个部分的导入路径都是相同的,如“sys.path”所定义。您的代码、Python 标准库或两者都可能会被重组,以利用(相对较新的)“绝对导入”方法——但是_that_(如果在标准库中完成)会破坏现有的应用程序,这些应用程序**做**依赖于能够用他们的代码替换一些标准库模块(通常是为了丰富它们),所以这不会是一个明显的胜利(重构你的代码,OTOH,是完全可行的,没有缺点)。 (2认同)