Python类型提示和`*args`

gca*_*ali 7 python types pycharm python-3.x typehints

假设我有这样的函数:

def foo(*args):
    for x in args:
        print(x)
Run Code Online (Sandbox Code Playgroud)

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

from typing import Tuple


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

或类似的东西

def foo(*args: int) -> None:
    for x in args:
        print(x)
Run Code Online (Sandbox Code Playgroud)

或完全不同的东西?

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

use*_*265 8

根据PEP-484

任意参数列表也可以进行类型注释,以便定义:

def foo(*args: str, **kwds: int): ...
Run Code Online (Sandbox Code Playgroud)

是可以接受的,这意味着,例如,以下所有内容都表示具有有效参数类型的函数调用:

foo('a', 'b', 'c')
foo(x=1, y=2)
foo('', z=0)
Run Code Online (Sandbox Code Playgroud)

在函数体中foo,变量的类型args推导为Tuple[str, ...],变量的类型kwdsDict[str, int]

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

def foo(*args: int) -> None:
    for x in args:
        print(x)
Run Code Online (Sandbox Code Playgroud)

在 Python 2 中:

def foo(*args):
    # type: (*int) -> None
    for x in args:
        print(x)
Run Code Online (Sandbox Code Playgroud)