为什么 token.py 的存在会导致内置 help() 崩溃? [复制]

2024-03-28

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


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 token.py 的存在会导致内置 help() 崩溃? [复制] 的相关文章

随机推荐

  • Ruby on Rails 中的 Gemfile 和 Gemfile.lock 有什么区别

    我是 Ruby on Rails 的初学者 我正在使用 Rails 3 0 9 有什么区别Gemfile and Gemfile lock在 Rails 中 The Gemfile是您指定要使用哪些 gem 的地方 并允许您指定哪些版本 T
  • 获取未安装字体的字体和 Windows 名称

    有人可以告诉我如何获得字体的字体名称吗 我如何获取具有字体名称的字体的 Windows 名称 例如 arialblackno1 ttf 其字体为 arialblack 但我希望获取未安装的字体的字体名称 它只是在一个文件夹中 您在评论中说您
  • C#属性和ref参数,为什么没有糖?

    我刚刚在 C 中工作时遇到了此错误消息 属性或索引器不能作为 out 或 ref 参数传递 我知道导致此问题的原因 并快速解决了创建正确类型的局部变量 并将其作为函数调用的问题out ref参数 然后将其分配回属性 RefFn ref ob
  • 为什么嵌套的 HTML 元素会让我的 CSS 跳转?

    这是一个谜题 基本页面 一个元素 http jsfiddle net PZj6t http jsfiddle net PZj6t HTML div div CSS body html height 100 margin 0 padding
  • 使用 COMMAw,d 转换数字

    我正在关注SAS 帮助页面 http support sas com documentation cdl en lrdict 64316 HTML default viewer htm a000200667 htm并试图获得与页面底部示例相
  • 测试 post 请求时 Django 消息中间件问题

    我正在尝试测试一个 UpdateView 它将一条消息添加到重定向的成功页面 看来我的问题来自messages因为 pytest 返回 django contrib messages api MessageFailure 如果不安装 dja
  • 计算文件中的字长

    所以我的函数应该打开一个文件并计算字长并给出输出 例如 许多 样本 txt 字长1 2 长度为 2 的单词 6 长度为 3 的单词 7 长度为 4 的单词 6 我的sample txt 文件包含 这是一个测试文件 1 个字的长度是多少 长度
  • 将 ProcessStartInfo.WorkingDirectory 设置为 UNC 路径

    我有一个用 VB net 编写的实用程序 它作为计划任务运行 它在内部调用另一个可执行文件 并且必须访问映射驱动器 显然 Windows 在用户未登录时访问映射驱动器的计划任务存在问题 即使向任务本身提供了身份验证凭据也是如此 好的 为了解
  • document.querySelector 获取包含括号的类名

    我正在编写的软件必须与我无法控制的第三方网络应用程序的 dom 配合使用 有些类名带有参数 例如class view box 200px 我猜这些类名是 Sass Less mixins arguments document querySe
  • 按文本而不是值对 Datagridview 的列进行排序

    我的 datagridview 中有一个列是组合框列 我希望它按其显示值 即文本 而不是其值 在本例中为数据库中的 int 列表 排序 我怎样才能做到这一点 您可以通过覆盖来做到这一点SortCompare事件于DataGridView w
  • Google App-Gmail 无法设置。通过 swiftmailer SMTP 传输 (PHP) 发送时 Gmail 替换地址

    您好 感谢您提前提供的任何帮助 我正在使用 swiftmailer SMTP 传输方法从我的 PHP 脚本发送电子邮件 发送消息就好了 有用 问题是 无论我将 FROM REPLYTO SENDER 设置为什么 电子邮件都会作为 GMAIL
  • Spring:具有自动装配依赖项的通用类

    我有一个标准的 Spring Boot MVC 应用程序 其中包含许多实体以及相应的存储库和服务 组件之间共享许多基础设施 因此我想将其抽象为通用类 我目前正在尝试实现这一目标的方式是这样的 仅显示传达想法的框架 interface Abs
  • CGAffineTransformMakeScale() 动画后扭曲视图框架

    我正在使用 theCGAffineTransformMakeScale 对视图进行动画处理 使其看起来像从屏幕中心生长一样 它在 iOS 8 beta 4 模拟器中运行良好 但在 7 1 版本中它会扭曲视图的框架 view alpha 0
  • 使用 UTF-8 的 getBytes() 不适用于大写德语变音符号

    为了开发我正在使用ResourceBundle直接从 IDE 中的资源目录读取 UTF 8 编码的属性文件 我在该文件的 Eclipse 文件属性中设置 native2ascii 用于生产 例如 menu file open label f
  • Android可取消启动画面

    我正在尝试按照以下规则创建一个具有横幅和取消按钮的启动页面 如果没有按下任何按钮 5 秒后转到主要活动 如果按下取消按钮 则立即转到主要活动 如果横幅被按下 则转到其他活动 My code public class BannerSplash
  • java.net.SocketException:打开的文件太多

    我有一个java应用程序 它运行得很好 在Ubuntu 10 04上 几个小时 直到它遇到 java net SocketException 打开文件太多 Sender java的代码可以找到here https code google c
  • 在 ansible shell 命令中使用 {{ 和 }}

    我的剧本里有这个 name Get facts about containers shell docker ps f name jenkins format raw Names endraw register container 请注意 我
  • Extjs4 在组合框中添加一个空选项

    我在 ExtJS4 中有一个带有此初始配置的组合框 xtype combobox name myCombo store MyStore editable false displayField name valueField id empty
  • 将 Hessian 矩阵定义为零

    在使用 scipy optimize minimize 和 trust constr 方法时 我得到了这个 UserWarning scipy optimize hessian update strategy py 187 UserWarn
  • 为什么 token.py 的存在会导致内置 help() 崩溃? [复制]

    这个问题在这里已经有答案了 作为一个爱好 学习项目 我正在用 Python 编写一个解析器生成器 我的一个代码文件名为 token py 其中包含几个用于将纯字符串转换为 Token 对象的类 我刚刚发现 在 Python 中使用控制台中的