【问题标题】:Pydev Code Completion for everythingPydev代码完成一切
【发布时间】:2011-09-07 07:22:56
【问题描述】:

在很多情况下(例如函数参数)Pydev 并不静态知道变量的类型。因此代码完成(在. 之后或使用ctrl+space 时)不起作用。

在大多数情况下,您在设计软件时知道运行时的类型。有没有办法提示 Pydev 代码正确完成它?

我猜这可能需要特定的 Pydev 功能,甚至可能需要一个新的 Python PIP。

这实际上似乎是所有动态语言的普遍问题......

更新:
也许有一个例子可以澄清:

def some_func(a_list, an_object):
    a_list.app        # Here I would not get code completion for append

如果 Pydev(或 PIP)支持,可以工作的示例:

from someobj import SomeObject
def some_func(a_list, an_object):
    # typecast: a_list=list
    # typecast: an_object=SomeObject
    a_list.app        # Now code completion would show append

我不赞同这种特定方法 - 它只是一个可以工作的系统示例。同样,这当然不应该是强制性的 - 但有时缺乏暗示类型的可能性很烦人。

【问题讨论】:

  • 你的意思是,除了添加不存在的类型注释是动态语言的优点之一?
  • @delnan - 是的!不要误会我的意思,我完全支持不强制注释。我正在考虑能够偶尔添加它们,也许作为 cmets(因为它们当然不是语言的一部分)
  • 函数参数是通用的和鸭子类型的,你希望它返回什么?
  • @delnan - 我怀疑声明变量更不利。有没有人对此进行过研究,以确定不声明变量是否真的节省了努力?我在无声明语言中看到了很多错误。 (为了记录,声明变量不会降低语言的动态性。即使是 Javascript 也有“var”!)

标签: python eclipse pydev code-completion


【解决方案1】:

[编辑]

从 PyDev 2.8.0 开始,它可以使用 docstrings 和 cmets 来发现对象的类型。

有关支持的格式的详细信息,请参阅:http://pydev.org/manual_adv_type_hints.html

[在 PyDev 2.8.0 之前]

以前,它只支持 assert isinstance 调用(现在仍然有效):

assert isinstance(a_list, list)

PyDev 将能够识别它并为它正确地提供代码补全(请注意,如果您发现它使您的代码变慢,您可以稍后在没有断言的情况下运行 Python:What does Python optimization (-O or PYTHONOPTIMIZE) do?

【讨论】:

  • 它没有装饰或注释那么优雅,因为如果a_list 不是真正的list,它实际上会使你的程序崩溃。我仍然希望看到 PIP 在未来优雅地解决它......
  • 从技术上讲,您是对的,但它不适用于函数调用,因此不是很有用。这个答案还不错,但我认为它不能回答问题。
  • 我会留意其他答案,所以如果有人有其他想法,请继续发布
  • @Jonathan 我认为在大多数情况下如果它使程序崩溃是一件好事,因为这意味着关于其运行时类型的原始假设是不正确的,这可能会导致更严重的错误(参见维基百科上的快速失败)。请注意,PyDev 足够聪明,可以理解 isinstance 的多种类型,因此如果您知道它在设计类型中可能是多种类型,您应该包含这些类型,这样如果变量属于预期类型,您的程序就不会失败。例如:如果您知道assert isinstance(my_var, (int, str)) 可能是intstr,请使用assert isinstance(my_var, (int, str))
  • @Fabio:PyDev 是否​​支持某种“x 类型列表”。比如 PyCharm 中的那个? jetbrains.com/pycharm/webhelp/… 是否有计划支持它,如果还没有的话?
【解决方案2】:

从 PyDev 2.8.0 开始,可以使用 Sphinx 或 Epydoc cmets 来完成代码: http://pydev.org/manual_adv_type_hints.html

【讨论】:

    【解决方案3】:

    如果您使用PyCharm,您可以选择 epydoc 或 sphinx 文档字符串样式,并根据该样式指定参数类型和函数返回值 (further discussion)

    【讨论】:

    • 请注意,从 PyDev 2.8.0 开始,PyDev 也支持 epydoc 或 sphinx 文档字符串。
    【解决方案4】:

    我通常会做些什么来规避这一点。

    def func(my_list_param):
        my_list_param = []
        my_list_param.appe # at this stage I would get code completion.
    

    只记得在测试或提交时删除变量初始化。 哦,顺便说一句,标记为答案的响应似乎对我不起作用。

    【讨论】:

    • 这种方法有太多的缺点,例如您不能将其留在代码中以供将来编辑,您一定会在提交之前忘记代码中的这些行...
    【解决方案5】:

    如果您在代码中使用 Python >= 3.5,您可以在函数声明 (26.1. typing — Support for type hints) 中指定参数类型,因此您的代码可以是:

    from someobj import SomeObject
    
    def some_func(a_list: list, an_object: SomeObject):
        a_list.app           # Code completion works
        an_object.a_method() # Code completion works
    

    这种类型的语法,对执行没有任何影响,并且不对传递给函数的真实类型做任何检查,但会使您的代码更具可读性并使代码完成工作。

    【讨论】:

      猜你喜欢
      • 2011-01-02
      • 2017-03-05
      • 2011-11-28
      • 2012-02-15
      • 2013-02-08
      • 2011-12-26
      • 1970-01-01
      • 2012-05-02
      相关资源
      最近更新 更多