【问题标题】:Type hinting in Eclipse with PyDev在 Eclipse 中使用 PyDev 进行类型提示
【发布时间】:2011-02-11 21:12:10
【问题描述】:

经过大量 PHP 经验后,我正在学习 Python,在 Python 中使用 type-hinting 会很方便。看起来带有 PyDev 的 Eclipse 不支持这个。有什么建议?

例如,我希望我的 IDE 在使用时显示函数 docstringstypes,例如:

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

f(# and now IDE shows everything about types 

【问题讨论】:

  • 你试过科莫多吗?不完全确定它处理文档字符串,但它确实有智能感知。
  • 谁能确认 Komodo 是否满足最初的问题?
  • 我测试了 vscode、Sublime Text、Wing IDE 和 Pycharm。只有 Pycharm 会报告 foo: str = 1 (Expected type 'str' got 'int' instead)。 Pycharms 重构也是最好的,虽然并不完美。

标签: python pydev type-hinting


【解决方案1】:

我不知道有什么方法可以在 Python 中进行类型提示。

标准的 Pythonic 做法是这样的:

>>> def adds_three(number):
...     '''Returns number + 3'''
...     return number + 3
...     

注意我做了以下事情:

  • 函数名称清晰可见
  • 参数名称应该是清楚的
  • 文档字符串详细说明了函数的作用
  • Python 是一种动态类型语言。为什么限制用户输入整数?浮点数还支持运算符+。让他们使用它。

动态类型的一个好处是所有方法都是继承重载的。当然,您可以随时在函数中进行类型检查以防止致命错误。

【讨论】:

    【解决方案2】:

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

    def f(x):
        """
        @x: int
        Adds 3 to x
        returns an int
        """
        return x + 3
    

    但在这种情况下,该函数非常简单,在我看来不需要任何类型信息,并且在 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 手册

    【讨论】:

    • “pydev 确实支持文档字符串(但不支持类型)补全”是什么意思?您能否指出一些有关 pydev 从文档字符串中推断出任何方法签名的程度的文档/示例?谢谢
    • 有关如何记录类型的更多详细信息,请参阅 PyDev 参考:pydev.org/manual_adv_type_hints.html
    【解决方案3】:

    介绍 Python 2/3

    对于局部范围变量和函数参数 PyDev 有这样的:

    assert isinstance(obj, MyClass)
    obj. # here hint will work
    

    虽然我猜这是一个未记录的功能。这是 PyDev 的 official page for type hints 和一些说明 Sphinx 语法的摘录。

    class Example:
    
      def param(self, a):
        ''':type a: MyClass'''
    
      def var(self, iterable):
        for a in iterable: #: :type a: AnotherClass
            pass
    

    很遗憾,这两种方法都不适用于班级成员。

    从 PyDev 4 开始,还有一些类似于 PEP-484 的东西(见下文)。

    class LatestExample:
    
      def listcase(self, param):
        ''':type param: list[str]'''
    
      def dictcase(self, param):
        ':type param: dict[str, MyClass]'
    

    未来的 Python 3

    看看@slushy 的回答。毫无疑问,这就是未来。但目前 PyDev 既不支持函数注释,PEP-3107,也不支持 @slushy 演示的新 PEP-484 东西。 PEP-484 以某种有限的形式出现在 Python 3.5 中,并在最终版本中出现在 3.6 中。这是 BDFL 的 PyCon 2015 presentation 用于类型提示和 PEP-484。

    【讨论】:

    • 这个解决方案非常适合我的 IDE (pycharm)。
    • 最佳答案,PyDev 什么时候支持 PEP 484?
    【解决方案4】:

    reStructuredTextepytextpython3注解可以在Python代码中定义期望的类型,并被pycharm等各种集成开发环境支持。这对于定义类名特别方便,因为它允许自动完成成员。

    epytext中的一个简单例子:

    def x_intercept(m, b):
        """
        Return the x intercept of the line M{y=m*x+b}.  The X{x intercept}
        of a line is the point at which it crosses the x axis (M{y=0}).
    
        @type  m: float
        @param m: The slope of the line.
        @type  b: number
        @param b: The y intercept of the line.  The X{y intercept} of a
                  line is the point at which it crosses the y axis (M{x=0}).
        @rtype:   number
        @return:  the x intercept of the line M{y=m*x+b}.
        """
        return -b/m
    

    【讨论】:

      【解决方案5】:

      截至 2014 年 8 月,Guido Van Rossum 的 proposal 在函数定义中使用 mypy 语法注释类型,说明新语法实际上是有效的 Python 3。他提案中的一个示例(还不是 PEP截至 2014 年 9 月)

      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
      

      【讨论】:

        猜你喜欢
        • 2020-06-13
        • 1970-01-01
        • 2010-12-27
        • 1970-01-01
        • 2022-01-17
        • 2014-07-15
        • 1970-01-01
        • 2011-12-01
        • 2013-09-03
        相关资源
        最近更新 更多