使用PyDev在Eclipse中键入提示

And*_*rew 19 python pydev type-hinting

在经历了很多PHP经验之后,我正在学习Python,并且在Python中使用类型提示会很方便.看起来Eclipse与PyDev不支持这一点.有什么建议?

例如,我希望我的IDE 在我使用它时显示函数文档字符串和类型,例如:

def f(x: int) -> int:
    r"""Adds 3 to x"""
    return x + 3

f(# and now IDE shows everything about types 
Run Code Online (Sandbox Code Playgroud)

cry*_*ryo 13

Python是一种动态类型语言,不需要声明变量类型.您可以添加有关要传递给文档字符串中的函数的预期类型的信息,例如

def f(x):
    """
    @x: int
    Adds 3 to x
    returns an int
    """
    return x + 3
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,函数非常简单,在我看来不需要任何类型的信息,只记录它的作用通常是python中记录严格类型的首选.

pydev确实支持docstring(但不是类型)完成并捕获许多错误,只要你打开python文件作为项目的一部分而不是通过将它们拖放到Eclipse中单独打开它们.

您需要通过右键点击项目的根添加包含Python文件的文件夹,选择Properties菜单项,然后选择PyDev - PYTHONPATH左侧的列表中,并单击Add source folder所有与Python文件的文件夹.请注意,如果有任何子目录,pydev通常可以在任何子目录中找到模块__init__.py,因此您通常只需要添加根python源文件夹.

在此之后,您可以通过键入访问工具提示ctrl+space 之前键入(,并通过键入自动填写建议的功能参数ctrl+space 后输入(.

另请参阅http://pydev.org/manual_101_root.html上的pydev手册


saa*_*aaj 12

现在的Python 2/3

对于局部范围变量和函数参数,PyDev具有:

assert isinstance(obj, MyClass)
obj. # here hint will work
Run Code Online (Sandbox Code Playgroud)

虽然我猜这是一个没有记录的功能.这是PyDev的类型提示的官方页面和一些说明Sphinx语法的摘录.

class Example:

  def param(self, a):
    ''':type a: MyClass'''

  def var(self, iterable):
    for a in iterable: #: :type a: AnotherClass
        pass
Run Code Online (Sandbox Code Playgroud)

不幸的是,它们都不适合班级成员.

因为,PyDev 4还有类似PEP-484的东西(见下文).

class LatestExample:

  def listcase(self, param):
    ''':type param: list[str]'''

  def dictcase(self, param):
    ':type param: dict[str, MyClass]'
Run Code Online (Sandbox Code Playgroud)

未来的Python 3

看看@slushy的回答.毫无疑问,这就是未来.但是目前PyDev既不支持功能注释,也不支持PEP-3107,也不支持新的PEP-484内容@slushy.PEP-484以某种有限的形式出现在Python 3.5中,最终以3.6的形式出现.这是BDFL的PyCon 2015演示类型提示和PEP-484.

  • 最佳答案,PyDev何时会支持PEP 484? (2认同)

slu*_*shy 9

截至2014年8月,Guido Van Rossum 提议在函数定义中使用mypy语法注释类型,声明新语法实际上是有效的Python 3.他的提案中的一个例子(截至2014年9月尚未成为PEP)

from typing import List, Dict

def word_count(input: List[str]) -> Dict[str, int]:
    result = {}  #type: Dict[str, int]
    for line in input:
        for word in line.split():
            result[word] = result.get(word, 0) + 1
    return result
Run Code Online (Sandbox Code Playgroud)

  • 自2014-09-29以来就是PIP:https://www.python.org/dev/peps/pep-0484/ (2认同)