【问题标题】:PyDev/Eclipse/Python not showing all methods of a classPyDev/Eclipse/Python 未显示类的所有方法
【发布时间】:2012-11-25 04:27:16
【问题描述】:

使用 PyDev 运行 Eclipse (Galileo)。我正在尝试使用模块 urllib2 并且我 刚刚 开始尝试使用它。我正在阅读的教程之一说在我的 urllib2.urlopen() 类上调用 geturl() 。所以我做到了,它按预期工作。

但是,当我尝试使用 Eclipse 的便捷“ctrl+space”快捷方式浏览类方法时,我感到很惊讶,它只为我提供了我认为是基类的私有方法:

当我做dir(page) 时,我得到了各种我可以玩的巧妙方法!

['__doc__', '__init__', '__iter__', '__module__', '__repr__', 'close', 'code', 'fileno', 'fp', 'getcode', 'geturl', 'headers', 'info', 'msg', 'next', 'read', 'readline', 'readlines', 'url']

这是一个 Eclipse 问题吗?还是用户错误?如果我把它放在 IDLE 中,我可以使用 IDLE 的自动完成功能来查看可用的方法,但是我无法获得与 PyDev 相同的功能;我相信它可以在我的工作电脑上运行,但我的家用电脑(我现在使用的电脑)似乎“不正常”。

我在 Google/Stackoverflow 上尽了最大努力,但我不确定哪些关键字会返回可能有助于我了解这里出了什么问题的结果。您能提供的任何见解都会很棒!

(Python 2.6,在 Debian (#!) 虚拟环境中运行,windows7 主机 - 如果有的话)

注意:我只是在 Debian 端开发,所以我在 Win7 上没有 Eclipse。

更新1:

回答“如果我向下滚动浏览器会以什么结尾?”它以 subclasshook 结尾。请参阅下面的照片,了解列表底部的外观(都是私有的,没有方法)。

更新 2:

正如上一篇文章所建议的那样,我进入首选项菜单并检查了自动完成选项卡和解释器首选项选项卡,似乎没有什么不合适的(但是,在阅读了 pydev 自动完成文档之后,我什么也没看到关于“防火墙”或任何表明存在防火墙的迹象。

不过,我又做了一次测试,见下图:

wx 的自动完成功能运行良好。也许我误解了在以前的帖子中告诉我的内容,但是,我理解我看到 page 类的魔法方法的原因是因为 PyDev 不知道还有什么可以填充它 - 所以它显然很困惑.我只是不确定从这里去哪里。我会继续阅读 PyDev 文档,看看我是否能在此期间弄清楚。

而且,我差点忘记了——当我将鼠标“悬停”在代码中的 urllib2.urlopen() 上时,它确实向我显示了文档字符串。不确定这是否提供了有关此假定损坏功能的任何见解。

更新3:

根据某人关于“强制内置”仅在 PyDev 中自动完成的评论,我在偏好设置下将“urllib2”添加到强制内置。下面是我得到的图像......

我有一些新方法...但不是我预期的方法(即,当我调用 dir(page) 时,我没有看到从 __dict__ 获得的方法,特别是 geturl())。

【问题讨论】:

  • 附注:并非所有这些都是方法——例如,code 和 fp,更不用说 __doc__ 和 __module__,都是属性。但更严重的是:如果您在 Eclipse 中滚动列表,它是否以 __repr__ 结尾?
  • 另外,您是在向我们展示交互式解释器还是文件编辑器?因为在 IDLE 中,我只能从交互式会话中获得这些完成;在源代码编辑器中,如果我输入 page. 并点击 Tab,它将完成当前交互会话中的任何 page,而不是我在源代码中定义的任何内容。
  • 啊,谢谢你的纠正,我只是假设它们都是方法。我对您关于“它以什么结尾”的问题添加了更新。
  • 我相信我在源代码编辑器中执行此操作...我没有像在 IDLE 中那样的“交互式解释器”设置...嗯,我担心我描述这个错误并使用错误的词汇...我在顶部有一个编辑器窗口 - 我的源代码在哪里(这是一个标准的 pydev 透视图),在下面我有一个“标签”,上面写着 Console,在那个窗口中,是我所有的 Python 输出。在顶部的窗口中观察到我的错误 - 我称之为源窗口。这有意义吗=/?
  • 这不是你的问题,但我认为你对“方法”这个词有点困惑。您会看到很多方法(例如,__ne__ 和 __reduce__),并且您错过了很多不是方法的东西(例如,code 和 fp)。您所看到的还包括很多在dir 中但不在__dict__ 中的东西,以及来自基类的东西。我认为更好的方式来描述您所看到的和未看到的内容是您只看到魔术方法(标准和非标准),即用两个下划线包围的方法。

标签: python eclipse ide pydev


【解决方案1】:

其中大部分是 Python 的“魔术方法”:

http://www.rafekettler.com/magicmethods.html

它们是您可以在任何对象上定义的特殊方法,以赋予其自定义行为。大多数 Python IDE 都知道不会显示它们,但 Eclipse 尤其有用。

【讨论】:

  • 嗯,很有趣。之前并没有真正区分魔术方法与“非魔术方法”。感谢那。您是否知道为什么 Eclipse 没有向我显示其余的类方法/属性?就像在这种情况下 geturl()?
  • 我认为这只是 Eclipse 假设任何类都支持的魔法方法的通用列表,当它可以猜测这是一个类类型的对象但无法猜测是哪一个时......(还有不是所有类都应该支持的非魔法方法。)
【解决方案2】:

您遇到的问题是像 Python 这样的动态语言的基本问题:您的 IDE 无法知道您的 page 变量所指的对象类型。为此,它必须知道urlopen() 返回的类型。如果不调用它,就无法知道这一点!每次调用它甚至可能不会返回相同的类型,在这种情况下,它应该向您显示什么类的方法?

IDE 可以进行一些猜测,但是当这些猜测失败时,您会得到与您所看到的一样的结果。它知道你有一个对象,因为一切都是一个对象,所以它会向你展示object的方法。

【讨论】:

  • IDE 确实有一种方法来判断——通过猜测和在子 shell 中运行各种代码位的组合。详情请见pydev.org/manual_adv_complctx.html。
  • @abarnert:IDE 仅对内置插件使用子shell,否则代码完成仅适用于在同一范围内定义的内容(根据您链接中的文档)——所以我认为有点可能是对的。
  • @martineau,你可能会在这里做一些事情 - 我将 urllib2 添加到“强制内置” - 请参阅我的 Update3 - 但当我使用 ctrl-space (自动-完全的)。有什么想法吗?
  • @martineau:不,“在同一范围内定义”包括知道如何遵循导入。否则将毫无用处。我相信它通常会尝试通过手动遍历配置的 PYTHONPATH 等来查找导入,而无需启动子 shell……但无论如何,如果配置正确,它肯定可以跟随导入。
  • 有趣,在您的 Update3 中,它看起来好像认为它是一个函数。在这一点上,我唯一的另一个想法是 IDE 配置不正确——所以我只能建议阅读提供的链接 abarnert 上的 Preferences 设置。
【解决方案3】:

如果你读到the documentation:

请务必注意,您的解释器必须正确配置才能使代码完成工作,并且为了获得内置程序,PyDev 会生成一个 shell,因此,如果防火墙阻止了代码完成,则可以阻止代码完成工作从 eclipse 到那个 shell 的通信。

换句话说,您必须进入首选项并设置“代码完成”设置和“解释器 - Python”设置,并确保 Eclipse 可以启动子外壳并通过套接字与它通信而无需防火墙或任何其他阻碍。

我的猜测是,在这些事情中,您的解释器设置很可能是错误的。即使您的 Python 位于通常的 /usr/bin/python 位置,您也可能已将 PyDev 设置为查找,例如 /usr/bin/python3 或 python26,或“不要猜测,始终使用 #! 行或项目-specific 设置”,或者您已将 Python 安装在每个用户的位置而不是系统范围内,或者谁知道。

查看“解释器 - Python”首选项页面中的内容,看看您是否可以按照 Eclipse 期望的方式运行 Python。如果不是,它将无法执行任何命令行完成,除了内置的基本内容。(正如我在其他地方所说,我相信这意味着它可以猜测page 是某种类类型,但它可以'不知道是什么类型,所以它会猜测几乎任何类对象都有的所有标准魔术方法,仅此而已。)

【讨论】:

    猜你喜欢
    • 2014-11-18
    • 2021-12-14
    相关资源
    最近更新 更多