Я прошел первые пара разделов в 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)."): ...
По крайней мере, мое первоначальное впечатление заключается в том, что аннотации излишни: декораторы могут делать все, что могут делать аннотации (и многое другое). Почему аннотации лучше, чем декораторы, когда дело доходит до добавления метаданных к функциям?