2016-04-19 66 views
1

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

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)在注释中使用它。

+0

你使用Python 3.5吗? –

+0

是的,我喜欢。我喜欢新的“async def”语法。 (注释中的字符数量是否最小?真的?) – CodenameLambda

回答

3

使用新添加到Python 3.5中的typing type hinting support;功能可调用,你并不需要的功能类型,你想要的东西,可以称之为:

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]。您选择哪一种是款式选择,我在此使用明确的选项作为我的个人偏好。

+2

这比简单地用'Callable'注释更好吗? – timgeb

+0

谢谢!我假设最后一个是返回的类型? – CodenameLambda

+1

@CodingLambdas:是的。 –