指定类型的集合的类型提示

320
使用 Python 3 的函数注释,可以指定同类型列表(或其他集合)中包含的项的类型,以便在 PyCharm 和其他 IDE 中进行类型提示。
以下是整数列表的伪代码示例:
def my_func(l:list<int>):
    pass

我知道使用文档字符串...

def my_func(l):
    """
    :type l: list[int]
    """
    pass

...但如果可能的话,我更喜欢注释风格。


你尝试过在函数注释中使用相同的格式吗?发生了什么事? - jonrsharpe
3
@jonrsharpe 当定义函数时,应该会引发一个错误,因为“type object is not subscriptable”。显然,您可以使用字符串:“def my_func(L:'list [int]')”,但我不知道PyCharm是否会像解析文档字符串一样解析它... - Bakuriu
1
@Bakuriu 是的,我指的是 'list[int]',如果没有表达清楚,我道歉。 - jonrsharpe
似乎 PyCharm 不会像处理文档字符串一样解析它。 - Eric W.
5个回答

316
截至2015年5月,PEP0484(类型提示)已正式被接受。草案实现也可在github上ambv/typehinting找到。
2015年9月,Python 3.5发布,支持类型提示,并包含一个新的typing模块。这允许对集合中包含的类型进行规范。截至2015年11月,JetBrains PyCharm 5.0完全支持Python 3.5,包括下面所示的类型提示。

PyCharm 5.0 Code Completion using Type Hints

原始回答

截至2014年8月,我确认使用Python 3类型注解无法指定集合中的类型(例如:字符串列表)。

使用格式化文档字符串(如reStructuredText或Sphinx)是可行的替代方法,并受到各种集成开发环境的支持。

此外,似乎Guido正在考虑扩展类型注解的思路,类似于mypy:http://mail.python.org/pipermail/python-ideas/2014-August/028618.html


更新:似乎类型提示已经支持泛型类型,并被纳入PEP484中。https://www.python.org/dev/peps/pep-0484/ - Eric W.
4
值得一提的是(因为我不喜欢盯着模糊的图像看):从那张图片中获得的关键信息是 l: List[str]。我投了 Alecxe 的答案,因为它以普通文本形式展示了它。 - ToolmakerSteve
1
从下面的答案中可以看出,自 Python3.9 版本开始,使用 list 而不是 List 更受青睐。 - Dimitri Lesnoff

197

自从Python 3.5正式发布以来,有一个支持类型提示的模块 - typing和相关的List"type"用于泛型容器。

换句话说,现在你可以这样做:

from typing import List

def my_func(l: List[int]):
    pass

这在Python 3.9版本之后已经被弃用,现在你可以直接使用内置的list而不是typing.List

5
在Python 3.9中已被取代。请参见https://dev59.com/Z2Af5IYBdhLWcg3wQQy4#62775680。 - wisbucky
@wisbucky 这整个答案部分需要更新。 - 9 Guy

178

从Python 3.9开始,内置类型与类型注释是通用的(参见PEP 585)。这使得可以直接指定元素的类型:

def my_func(l: list[int]):
    pass
这也适用于标准库的大多数其他容器类型,例如collections.dequecollections.abc.Mapping
在 Python 3.9 之前,各种工具可能支持此语法。当注释在运行时不被检查时,可以使用引号或__future__.annotations,该语法是有效的。
# quoted
def my_func(l: 'list[int]'):
    pass
# postponed evaluation of annotation
from __future__ import annotations

def my_func(l: list[int]):
    pass

由于 PEP 585 的影响,与标准库类型相对应的大多数 typing 辅助程序都已被弃用,例如 typing.Listtyping.Dequetyping.Mapping。只有在需要与 Python 3.9 之前的版本兼容时才应使用它们。


59

PEP 484以来,已经添加了类型注释。

from . import Monitor
from typing import List, Set, Tuple, Dict


active_monitors = [] # type: List[Monitor]
# or
active_monitors: List[Monitor] = []

# bonus
active_monitors: Set[Monitor] = set()
monitor_pair: Tuple[Monitor, Monitor] = (Monitor(), Monitor())
monitor_dict: Dict[str, Monitor] = {'codename': Monitor()}

# nested
monitor_pair_list: List[Dict[str, Monitor]] = [{'codename': Monitor()}]

这个对我在PyCharm中使用Python 3.6.4目前有效。

在Pycharm中的示例图片


4

在BDFL的支持下,现在几乎可以确定Python(可能是3.5)将通过函数注释提供标准化的类型提示语法。

https://www.python.org/dev/peps/pep-0484/

正如PEP中提到的那样,有一种名为mypy的实验性类型检查器(类似于pylint,但用于类型),已经使用了这个标准,并且不需要任何新语法。

http://mypy-lang.org/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接