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]
。我只是选择了显式而不是隐式。