我正在学习Python,经过大量的PHP经验,在Python中使用 type-hinting 会很方便。看起来Eclipse与PyDev不支持这一点。有什么建议?
例如,当我使用它时,我希望我的IDE显示函数 docstrings 和 types ,例如:
def f(x: int) -> int:
r"""Adds 3 to x"""
return x + 3
f(# and now IDE shows everything about types
答案 0 :(得分:13)
Python是一种动态类型语言,不需要声明变量类型。您可以添加有关要传递给文档字符串中的函数的期望类型的信息,例如,
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
输入(
后。
答案 1 :(得分:12)
对于局部范围变量和函数参数,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]'
看看@slushy的回答。毫无疑问,这就是未来。但是目前PyDev既不支持函数注释,也不支持PEP-3107,也不支持@slushy演示的新PEP-484内容。 PEP-484以某种有限的形式出现在Python 3.5中,最终以3.6的形式出现。这是BDFL的PyCon 2015 presentation类型提示和PEP-484。
答案 2 :(得分:9)
截至2014年8月,Guido Van Rossum有proposal在函数定义中使用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
答案 3 :(得分:1)
我不知道有什么方法可以在Python中进行类型提示。
标准的Pythonic练习是这样的:
>>> def adds_three(number):
... '''Returns number + 3'''
... return number + 3
...
注意我已完成以下操作:
+
。让他们使用它。动态类型的一个好处是所有方法都是继承重载的。当然,您始终可以在函数中进行类型检查以防止致命错误。
答案 4 :(得分:0)
reStructuredText,epytext和python3注释可以在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