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