Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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_Python 3.5_Type Hinting_Mypy - Fatal编程技术网

Python 如何在类型提示中指定函数类型?

Python 如何在类型提示中指定函数类型?,python,python-3.x,python-3.5,type-hinting,mypy,Python,Python 3.x,Python 3.5,Type Hinting,Mypy,我想在我当前的Python 3.5项目中使用类型提示。我的函数应该接收一个函数作为参数 如何在我的类型提示中指定类型函数? import typing def my_function(name:typing.AnyStr, func: typing.Function) -> None: # However, typing.Function does not exist. # How can I specify the type function for the param

我想在我当前的Python 3.5项目中使用类型提示。我的函数应该接收一个函数作为参数

如何在我的类型提示中指定类型函数?

import typing

def my_function(name:typing.AnyStr, func: typing.Function) -> None:
    # However, typing.Function does not exist.
    # How can I specify the type function for the parameter `func`?

    # do some processing
    pass
我检查了,但在那里找不到函数类型提示。

如注释中所述,这可以通过以下方法完成:

问题是,
Callable
本身被翻译成
Callable[…,Any]
,这意味着:

可调用函数接受任意数量/类型的参数,并返回任意类型的值。在大多数情况下,这不是您想要的,因为您将允许传递几乎任何函数。您还需要提示函数参数和返回类型

这就是为什么
类型
中的许多
类型
被重载以支持表示这些额外类型的子脚本。例如,如果有一个函数
sum
,它取两个
int
s并返回一个
int

def sum(a: int, b: int) -> int: return a+b
您对它的注释是:

Callable[[int, int], int]
也就是说,这些参数在外部订阅中是子脚本,返回类型是外部订阅中的第二个元素。一般而言:

Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType]

另一个需要注意的有趣点是,您可以使用内置函数
type()
获取内置函数的类型并使用它。 所以你本来可以

def f(my_function: type(abs)) -> int:
    return my_function(100)

或者类似的形式

最简单、最奇特的解决方案是:

def f(my_function: type(lambda x: None)):
    return my_function()
这可以通过以下方式证明:

def poww(num1, num2):
    return num1**num2
    
print(type(lambda x: None) == type(poww))
输出将是:
True

函数是“我们可能添加”之前的最后一个要点。这个
键入
的东西将整个python语言提升了一个档次。@javadba-哦,是的,但我仍然不确定是哪个拨号盘。。。顺便问一下,对于
*args
**kwargs
、仅关键字args和仅位置args,
可调用[[Arg,类型,此处]、…]
如何?他们没有考虑过在可调用项的类型签名中调用约定吗?;)
typing.Callable
似乎更倾向于
collections.abc.Callable
:类型提示可以是您想要的任何内容,但它们并不总是经过惰性评估。另外,您的函数是否真的只将
内置函数或
作为
我的函数
?难道一个
lambda
不起作用吗?用户定义的函数或绑定方法?这是一种非常聪明的方法,至少对于疑难解答或头脑风暴来说是这样。不,当运行
mypy
时,这会产生错误:
错误:无效的类型注释或批注
注意:建议:使用类型[…]而不是类型(…)
。这种注释类型的方式不包含有关签名的任何信息:参数数量、这些参数的类型、返回值类型。可以像这样注释函数类型,但我不推荐这样做。正如其他答案中所建议的那样,最好使用
键入.Callable
def poww(num1, num2):
    return num1**num2
    
print(type(lambda x: None) == type(poww))