2

使用 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”添加到首选项下的强制内置。下面是我得到的图像......

在此处输入图像描述

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

4

3 回答 3

0

如果您阅读文档

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

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

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

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

于 2012-12-07T01:55:41.150 回答
0

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

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

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

于 2012-12-07T01:32:04.767 回答
0

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

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

于 2012-12-07T01:49:13.550 回答