Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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_Annotations_Type Hinting - Fatal编程技术网

Python 函数注释

Python 函数注释,python,python-3.x,annotations,type-hinting,Python,Python 3.x,Annotations,Type Hinting,我真的很喜欢函数注释,因为它们使我的代码更加清晰。 但我有一个问题:如何注释一个函数,它将另一个函数作为参数?还是返回一个 def x(f: 'function') -> 'function': def wrapper(*args, **kwargs): print("{}({}) has been called".format(f.__name__, ", ".join([repr(i) for i in args] + ["{}={}".format(key,

我真的很喜欢函数注释,因为它们使我的代码更加清晰。 但我有一个问题:如何注释一个函数,它将另一个函数作为参数?还是返回一个

def x(f: 'function') -> 'function':
    def wrapper(*args, **kwargs):
        print("{}({}) has been called".format(f.__name__, ", ".join([repr(i) for i in args] + ["{}={}".format(key, value) for key, value in kwargs])))
        return f(*args, **kwargs)
    return wrapper
我不想在注释中使用
Function=type(lambda:None)
;函数是可调用的,您不需要函数类型,您需要可以调用的函数:

from typing import Callable, Any

def x(f: Callable[..., Any]) -> Callable[..., Any]:
    def wrapper(*args, **kwargs):
        print("{}({}) has been called".format(f.__name__, ", ".join([repr(i) for i in args] + ["{}={}".format(key, value) for key, value in kwargs])))
        return f(*args, **kwargs)
    return wrapper
上面指定您的
x
接受接受任何参数的可调用对象,其返回类型为
any
,例如,任何情况下,它都是通用可调用对象
x
然后返回与泛型相同的内容


您也可以用
x(f:Callable)->Callable:
来表达这一点;普通的
Callable
相当于
Callable[…,Any]
。您选择哪一个是样式选择,我在这里使用显式选项作为我个人的首选。

您使用的是Python 3.5吗?是的,我使用。我喜欢新的“async def”语法。(注释中的最小字符数?真的吗?)这比简单地用
可调用的
注释更好吗?@CodingLambdas:是的。@timgeb:类型推断工具现在可以对使用此装饰器的任何内容做出进一步的断言,IDE可以根据提示自动完成,等等。@timgeb:在这种特定情况下,装饰程序必须接受非常通用的可调用,并且不能对该可调用进行任何进一步的断言,但在大多数代码中,断言将更加具体。@timgeb:是的,普通的
callable
相当于
callable[…,any]
。我只是选择了显式而不是隐式。