Eclipse pydev 在某些情况下无法自动建议
我这个问题可能有点傻,希望有人能帮我解决这个问题。
有时候我在自动补全框里看不到正确的建议(使用的是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 是否足够聪明,能够在编译时去掉这个赋值。
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
,这将来会解决你的一些问题……