我的问题可能很愚蠢,我希望有人成功地解决了这个问题。
有时我在自动完成框中看不到正确的建议(Eclipse 3.5.2,PyDev 1.5.7)。例如:
import email
fp = open('my.eml', 'rb')
msg = email.message_from_file(fp)
msg
现在是一个Message对象。像get_payload()这样的函数可以正常工作。
msg.get_payload()
但我没有在自动完成列表中获得get_payload()
。
我认为PyDev不知道msg
是什么,所以它不知道要展示什么。
也许我应该导入别的东西,而不仅仅是email
模块?
提前致谢!
答案 0 :(得分:4)
在我遇到this link之前,我一直在努力解决这个问题。我使用了该链接中建议的第二个解决方案,它就像一个魅力。
基本上,您需要在从函数调用中获取assert isinstance(msg, Message)
后插入msg
。
答案 1 :(得分:3)
有可能,当前的PyDev构建还没有达到能够从函数中提取(在你的情况下为message_from_file()
)以了解它返回什么类型的对象以便提供自动完成的程度提示。
请参阅http://sourceforge.net/projects/pydev/forums/forum/293649/topic/3697707。
编辑我相信PyDev有兴趣支持新的Python 3函数语法PEP 3107
,这将解决你将来的一些问题。
答案 2 :(得分:1)
我知道docstring中的@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,here's a link来解释可能性。