Функциональные аннотации: PEP-3107
Я наткнулся на фрагмент кода, демонстрирующий аннотации функций Python3. Концепция проста, но я не могу думать о том, почему они были реализованы в Python3, или о каком-либо хорошем их использовании. Возможно, ТАК может просветить меня?
Как это устроено:
def foo(a: 'x', b: 5 + 6, c: list) -> max(2, 9):
... function body ...
Все, что следует после двоеточия после аргумента, является «аннотацией», а информация, следующая за ->
ним, является аннотацией для возвращаемого значения функции.
foo.func_annotations возвращает словарь:
{'a': 'x',
'b': 11,
'c': list,
'return': 9}
Каково значение наличия этого?
python
function
annotations
python-3.x
agscala
источник
источник
foo.func_annotations
бытьfoo.__annotations__
в python3?def foo(a: 'x', b: 5 + 6, c: list) -> max(2, 9):
значит?Ответы:
Я думаю, что это действительно здорово.
Исходя из академического опыта, я могу вам сказать, что аннотации оказались неоценимыми для создания интеллектуальных статических анализаторов для таких языков, как Java. Например, вы можете определить семантику, такую как ограничения состояния, потоки, доступ к которым разрешен, ограничения архитектуры и т. Д., И существует довольно много инструментов, которые могут затем прочитать их и обработать, чтобы получить гарантии, выходящие за пределы того, что вы получаете от компиляторов. Вы могли бы даже написать вещи, которые проверяют предусловия / постусловия.
Мне кажется, что-то вроде этого особенно необходимо в Python из-за его более слабой типизации, но на самом деле не было никаких конструкций, которые делали бы это простым и частью официального синтаксиса.
Существуют и другие варианты использования аннотаций, которые не поддаются проверке. Я вижу, как я могу применить свои инструменты на основе Java к Python. Например, у меня есть инструмент, который позволяет назначать специальные предупреждения методам и дает вам указание, когда вы вызываете их, что вам следует прочитать их документацию (например, представьте, что у вас есть метод, который нельзя вызывать с отрицательным значением, но он не интуитивно понятно из названия). С аннотациями я мог бы написать что-то подобное для Python. Аналогично, инструмент, который организует методы в большом классе на основе тегов, может быть написан при наличии официального синтаксиса.
источник
Аннотации функций - это то, что вы делаете из них.
Они могут быть использованы для документации:
Их можно использовать для проверки предварительных условий:
Также см. Http://www.python.org/dev/peps/pep-0362/, чтобы узнать , как реализовать проверку типов.
источник
Mass
иVelocity
вместо этого.def kinetic_energy(mass: 'in kilograms', velocity: 'in meters per second') -> float:
бы также показать тип возвращаемого значения. Это мой любимый ответ здесь.return
аннотацию? Это, кажется, не появляется вlocals
Это слишком поздний ответ, но AFAICT, лучшее текущее использование аннотаций функций - это PEP-0484 и MyPy .
Используется так:
источник
list(fib('a'))
с вашей примерной функцией, Python 3.7 с радостью принимает аргумент и жалуется, что нет способа сравнить строку и int.Просто чтобы добавить конкретный пример хорошего использования из моего ответа здесь , в сочетании с декораторами можно сделать простой механизм для мультиметодов.
и пример использования:
Это можно сделать, добавив типы в декоратор как оригинальный пост Гвидо. показано , но лучше пометить сами параметры, поскольку это исключает возможность неправильного сопоставления параметров и типов.
Примечание . В Python вы можете получить доступ к аннотациям,
function.__annotations__
а неfunction.func_annotations
к томуfunc_*
стилю, который был удален в Python 3.источник
function = self.typemap.get(types)
, оно не сработает, если задействованы подклассы. В этом случае вы , вероятно , придется перебратьtypemap
использованиемisinnstance
. Интересно,@overload
__annotations__
то,dict
что не обеспечивает порядок аргументов, поэтому этот фрагмент кода иногда завершается ошибкой. Я рекомендовал бы изменяяtypes = tuple(...)
кspec = inspect.getfullargspec(function)
тогдаtypes = tuple([spec.annotations[x] for x in spec.args])
.Ури уже дал правильный ответ, поэтому вот менее серьезный: так что вы можете сделать свои строки документов короче.
источник
Когда я впервые увидел аннотации, я подумал: «Отлично! Наконец-то я могу выбрать проверку типов»! Конечно, я не заметил, что аннотации на самом деле не применяются.
Поэтому я решил написать простой декоратор функций для обеспечения их выполнения :
Я добавил его в библиотеку Ensure .
источник
Прошло много времени с тех пор, как это было задано, но приведенный в вопросе фрагмент примера (как указано там же) взят из PEP 3107, а в конце этого примера PEP также приведены примеры использования, которые могут ответить на вопрос с точки зрения PEP. Посмотреть ;)
Ниже приводится цитата из PEP3107
Случаи использования
В ходе обсуждения аннотаций был поднят ряд вариантов использования. Некоторые из них представлены здесь, сгруппированы по типу информации, которую они передают. Также включены примеры существующих продуктов и пакетов, которые могут использовать аннотации.
См. ПКП для получения дополнительной информации о конкретных точках (а также их ссылки)
источник
Python 3.X (только) также обобщает определение функции, позволяя аннотировать аргументы и возвращаемые значения значениями объекта для использования в расширениях. .
Его META-данные, чтобы объяснить, чтобы быть более явным о значениях функции.
Аннотации кодируются как
:value
после имени аргумента и перед значением по умолчанию, так и как->value
после списка аргументов.Они собраны в
__annotations__
атрибут функции, но сами Python не рассматривают их как особые:ПРИМЕР:
typeannotations
Модуль предоставляет набор инструментов для проверки типа и типа вывода кода Python. Он также предоставляет набор типов, полезных для аннотирования функций и объектов.Эти инструменты в основном предназначены для использования статическими анализаторами, такими как линтеры, библиотеки автозавершения кода и IDE. Кроме того, предоставляются декораторы для проверки во время выполнения. Проверка типов во время выполнения не всегда хорошая идея в Python, но в некоторых случаях она может быть очень полезной.
https://github.com/ceronman/typeannotations
Как набор текста помогает писать лучший код
PEP 526 - Синтаксис для переменных аннотаций
https://www.python.org/dev/peps/pep-0526/
https://www.attrs.org/en/stable/types.html
источник
Несмотря на все варианты использования, описанные здесь, единственное обязательное и, скорее всего, принудительное использование аннотаций будет для подсказок типа .
В настоящее время это никоим образом не применяется, но, исходя из PEP 484, в будущих версиях Python типы будут использоваться только в качестве значения для аннотаций.
Цитирование Как насчет существующего использования аннотаций? :
Хотя в 3.6 я еще не видел тихой амортизации, это вполне может быть увеличено до 3.7.
Таким образом, хотя могут быть и другие хорошие варианты использования, лучше всего хранить их исключительно для подсказок типов, если вы не хотите менять все в будущем, когда это ограничение действует.
источник
В качестве отложенного ответа некоторые из моих пакетов (marrow.script, WebCore и т. Д.) Используют аннотации, где они доступны, для объявления типов: (например, преобразование входящих значений из Интернета, определение того, какие аргументы являются булевыми переключателями и т. Д.) как выполнить дополнительную разметку аргументов.
Marrow Script создает полный интерфейс командной строки для произвольных функций и классов и позволяет определять документацию, приведение значений и значения по умолчанию, основанные на обратном вызове, с помощью аннотаций с декоратором для поддержки более старых сред выполнения. Все мои библиотеки, которые используют аннотации, поддерживают формы:
«Голая» поддержка строк документации или функций приведения типов позволяет легче смешивать их с другими библиотеками, поддерживающими аннотации. (Т.е. есть веб-контроллер, использующий приведение типов, который также отображается как сценарий командной строки.)
Отредактировано, чтобы добавить: я также начал использовать пакет TypeGuard , используя для проверки утверждения времени разработки. Преимущество: при запуске с включенной «оптимизацией» (
-O
/PYTHONOPTIMIZE
env var) проверки, которые могут быть дорогостоящими (например, рекурсивными), опускаются, поскольку предполагается, что вы должным образом протестировали свое приложение в процессе разработки, поэтому проверки не должны быть необходимы в производстве.источник
Аннотации могут быть использованы для простой модуляции кода. Например, модуль для программы, которую я поддерживаю, может просто определить метод как:
и мы могли бы спросить пользователя о вещи с именем «param1», которая «необходима для подсчета» и должна быть «int». В конце концов, мы даже можем преобразовать строку, заданную пользователем, в желаемый тип, чтобы получить самый простой и удобный опыт.
Смотрите наш объект метаданных функции для класса с открытым исходным кодом, который помогает с этим и может автоматически извлекать необходимые значения и преобразовывать их в любой желаемый тип (поскольку аннотация является методом преобразования). Даже IDE показывают правильное автозаполнение и предполагают, что типы соответствуют аннотациям - идеально подходит.
источник
Если вы посмотрите на список преимуществ Cython, основным из них будет возможность сообщить компилятору, какой тип объекта Python.
Я могу представить себе будущее, в котором Cython (или аналогичные инструменты, которые компилируют некоторый ваш код Python) будут использовать синтаксис аннотации, чтобы творить чудеса.
источник
multiply
функцию работать только против целых чисел, когда'na' * 8 + ' batman!'
она полностью действительна? ;)