Python类型提示和`* args`

时间:2015-11-26 13:46:58

标签: python python-3.x types pycharm typehints

假设我有这样的功能:

def foo(*args):
    for x in args:
        print(x)

让我们说我想说args的所有元素都是int;从PEP 0484开始表达它的正确方法是什么?我应该做点什么吗

from typing import Tuple


def foo(*args: Tuple[int, ...]) -> None:
    for x in args:
        print(x)

或类似

def foo(*args: int) -> None:
    for x in args:
        print(x)

或其他完全不同的东西?

特别是,我试图在PyCharm中有效地使用类型提示,并且我所想到的解决方案似乎都没有帮助PyCharm理解x应该是int }。

2 个答案:

答案 0 :(得分:3)

根据PEP-484

  

任意参数列表也可以是类型注释,因此定义:

def foo(*args: str, **kwds: int): ...
     

是可以接受的,这意味着,例如,以下所有代表使用有效类型的参数的函数调用:

foo('a', 'b', 'c')
foo(x=1, y=2)
foo('', z=0)
     

在函数foo的正文中,变量args的类型推导为Tuple[str, ...],变量kwds的类型为Dict[str, int]

从示例中注释foo函数的正确方法是:

def foo(*args: int):
    for x in args:
        print(x)

在Python 2中:

def foo(*args):
    # type: (*int) -> NoReturn
    for x in args:
        print(x)

答案 1 :(得分:0)

你应该看一下docstrings。 PyCharm允许您在文档字符串中定义您的参数,包括或不包含类型。如果定义类型,则提示将考虑参数的类型。

def foo(*args):
    """
    General information about foo
    :param [int] args: info about args
    """

    for x in args:
        print(x)