Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python类型提示和`*参数`_Python_Python 3.x_Types_Pycharm_Typehints - Fatal编程技术网

Python类型提示和`*参数`

Python类型提示和`*参数`,python,python-3.x,types,pycharm,typehints,Python,Python 3.x,Types,Pycharm,Typehints,假设我有这样一个函数: def foo(*args): for x in args: print(x) 假设我想说,args的所有元素都是int;什么是正确的表达方式?我应该做类似的事情吗 from typing import Tuple def foo(*args: Tuple[int, ...]) -> None: for x in args: print(x) def foo(*args: int) -> None:

假设我有这样一个函数:

def foo(*args):
    for x in args:
        print(x)
假设我想说,
args
的所有元素都是
int
;什么是正确的表达方式?我应该做类似的事情吗

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)
或者类似的

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
您应该看看文档字符串。PyCharm允许您在docstring中定义参数,包括或不包括类型。如果定义类型,提示将考虑参数的类型

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

    for x in args:
        print(x)
根据:

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

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) -> None:
    for x in args:
        print(x)
在Python 2中:

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

很好,作为一个快速解决方案,它似乎有效。我仍然更喜欢基于类型提示和函数注释的解决方案,但如果没有结果,我会解决这个问题。您的第一种方法是正确的,请使用
Tuple[int,…]
*args:int
总是错误的,因为Python将使用传递的多余位置值为
*args
创建一个元组。@JimFasarakisHilliard根据现在接受的答案,
*args
**kwargs
似乎是特殊大小写的。