Какая польза от аннотаций функции Python?

Я прошел первые пара разделов в 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)."): ...

По крайней мере, мое первоначальное впечатление заключается в том, что аннотации излишни: декораторы могут делать все, что могут делать аннотации (и многое другое). Почему аннотации лучше, чем декораторы, когда дело доходит до добавления метаданных к функциям?

Ответ 1

Как вы уже упоминали, соответствующий PEP 3107 (ссылка для простой справки в случае, если другие сталкиваются с этим вопросом, еще не прочитали его).

В настоящее время аннотации - это своего рода эксперимент и вид незавершенного производства. Фактически в потоке список рассылки python-идей есть тема, которая может быть полезна. (Ссылка предоставлена ​​только для ежемесячного архива, я обнаружил, что URL-адрес для определенных сообщений имеет тенденцию к изменению периодически. Этот вопрос находится в начале декабря и озаглавлен "[Соглашения о концепции Python] для аннотаций функций". первый пост от Томаса Клюйвера 1 декабря.)

Здесь немного от одного из сообщений Guido van Rossum в этом потоке:

12/4/2012 11:43, Jasper St. Pierre писал (а):

Действительно. Раньше я смотрел аннотации, но я никогда не понимал цель. Это казалось особенностью, которая была разработана и реализована без некоторая цель, и где сообщество должно было открыть цель сами по себе.

Ответ Guido:

Напротив. Было слишком много случаев использования, которые сразу же выглядели важно, и мы не могли понять, какие из них были бы самыми важно или как их объединить, поэтому мы решили сделать двухэтапный подход: на шаге 1 мы разработали синтаксис, тогда как на шаге 2 мы будет разрабатывать семантику. Идея была очень ясна, что синтаксис был решен, люди могли бы свободно экспериментировать с разными семантика - просто не в stdlib. Идея заключалась также в том, что в конечном счете, из всех этих экспериментов, появится подходит для stdlib.

Джаспер Сен-Пьер:

Итак, если я могу спросить, какова была первоначальная цель аннотаций? PEP дает некоторые предложения, но не оставляют ничего конкретного. Был ли он разработан помощь для IDE или инструменты статического анализа, которые проверяют исходный код? Что нибудь для самих приложений, чтобы обеспечить особое поведение, как синтаксический анализатор командной строки или статическая проверка времени выполнения?

Ответ Guido:

В значительной степени все вышеизложенное. Но для меня лично, основная цель заключалась всегда в том, чтобы указать обозначение для указания типа ограничения (и, возможно, другие ограничения) для аргументов и возврата значения. Я играю в разное время с конкретными способами комбинирования типы. Например. list [int] может означать список целых чисел, а dict [str, tuple [float, float, float, bool]] может означать строки отображения dict для кортежи из трех поплавков и bool. Но я чувствовал, что было намного сложнее получить консенсус относительно таких обозначений, кроме синтаксиса аргумента аннотации (подумайте о том, сколько возражений вы можете внести в эти два примера:-) - У меня всегда было сильное желание использовать "var: type = по умолчанию" и сделать тип выражения времени выполнения оценкой в то же время, что и по умолчанию.

И крошечный юмор от Неда Батчелдера:

Говорящий момент для меня был во время раннего выступления Py3k в PyCon (возможно это было в Далласе или Чикаго?), Гвидо не мог вспомнить слово "аннотация", и сказал: "вы знаете, те вещи, которые не являются типом объявления?": -)

Ответ 2

Я думаю, что в первом абзаце сказано все:

Поскольку в серии Python 2.x отсутствует стандартный способ аннотирования параметров функции и возвращаемых значений

(акцент мой)

Наличие стандартного способа сделать это имеет то преимущество, что вы точно знаете, где будут размещаться аннотации.

Что касается вашего аргумента о том, есть ли другой способ сделать это, вы можете сделать тот же аргумент против понимания списка:

out = []
for x in my_iterable:
    out.append(x)

Ответ 3

У них две разные роли.

Аннотации - это документация/комментарий для аргументов, в то время как декоратор преобразует функцию.

Сам по себе Python не привязывает к аннотации какое-либо конкретное значение или значение.

Страница декораторов Python

Декораторы динамически изменяют функциональные возможности функции, метода или класса без непосредственного использования подклассов или изменения исходного кода выполняемой функции.