我已经浏览了 PEP 3107 中的前几节,但我仍然不明白它们对语言有什么好处。在我看来,您可以使用装饰器将元数据添加到函数中。例如
def returns(return_type):
f.return_type = return_type # <- adding metadata here
return f
@returns(Foo)
def make_foo(): ...
您也可以将元数据添加到参数中,如果您利用默认参数,它看起来会很漂亮,如下所示:
import inspect
def defaults_are_actually_metadata(f):
names, args_name, kwargs_name, defaults = inspect.getfuncspec(f)
f.parameter_metadata = dict(zip(names[-len(defaults):], defaults))
f.__defaults__ = ()
return f
@defaults_are_actually_metadata
def haul(load="Stuff to be carried.",
speed_mph="How fast to move the load (in miles per hour)."): ...
至少我最初的印象是注解是多余的:装饰器可以做所有注解可以做的事情(甚至更多)。在向函数添加元数据时,为什么注释比装饰器更好?