Eclipse pydev 在某些情况下无法自动建议

7 投票
3 回答
3738 浏览
提问于 2025-04-15 22:59

我这个问题可能有点傻,希望有人能帮我解决这个问题。

有时候我在自动补全框里看不到正确的建议(使用的是Eclipse 3.5.2和PyDev 1.5.7)。比如说:

import email
fp = open('my.eml', 'rb')
msg = email.message_from_file(fp)

msg 现在是一个消息对象。而像 get_payload() 这样的函数运行得很好。

msg.get_payload()

但是我在自动补全列表里找不到 get_payload()

我觉得PyDev不知道 msg 是什么,所以它不知道该显示什么。

也许我应该导入其他东西,而不仅仅是 email 模块?

提前谢谢大家!

3 个回答

1

我知道在文档字符串中使用 @type 是有效的。比如:

from collections import deque

def foo(a):
''' code completion sample
@type a: deque
'''
return a.popleft()  # Code completion will work here

但是我找不到一种方法可以在代码中直接使用(除了其他地方提到的那种方法,就是假装把变量赋值为某个类型的实例),就像这样:

from collections import deque

def foo(a):
''' code completion sample '''
if false: a = deque()
return a.popleft()  # Code completion will also work here

不过我不太喜欢这种方法,因为这样可能会影响性能或代码大小。我不确定/也没有检查过 Python 是否足够聪明,能够在编译时去掉这个赋值。

感谢 SiSoie这里有一个链接,可以查看相关的说明。

4

我也在这个问题上纠结了很久,直到我发现了这个链接。我用了链接里提到的第二个解决方案,效果非常好。

简单来说,你需要在从函数调用得到msg之后,插入assert isinstance(msg, Message)这行代码。

3

现在的PyDev版本可能还没有达到能够从某个函数(在你的例子中是message_from_file())提取信息的水平,因此它无法知道这个函数返回什么类型的对象,也就无法提供自动补全的提示。

你可以查看这个链接了解更多信息:http://sourceforge.net/projects/pydev/forums/forum/293649/topic/3697707.

补充:我相信PyDev对支持新的Python 3函数语法是有兴趣的,具体可以参考PEP 3107,这将来会解决你的一些问题……

撰写回答