Недавно я заметил кое-что интересное, глядя на спецификацию грамматики Python 3.3 :
funcdef: 'def' NAME parameters ['->' test] ':' suite
Необязательный блок «стрелка» отсутствовал в Python 2, и я не смог найти никакой информации относительно его значения в Python 3. Оказалось, что это правильный Python, и он принят интерпретатором:
def f(x) -> 123:
return x
Я думал, что это может быть какой-то синтаксис предварительного условия, но:
- Я не могу проверить
x
здесь, это все еще не определено, - Независимо от того, что я поставил после стрелки (например
2 < 1
), это не влияет на поведение функции.
Может ли кто-нибудь, привыкший к этому синтаксису, объяснить это?
.__annotations__
атрибута.__annotations__
атрибут это словарь. Ключreturn
используется для получения значения после стрелки.Это функциональные аннотации, описанные в PEP 3107 . В частности,
->
помечает аннотацию функции возврата.Примеры:
Аннотации являются словарями, поэтому вы можете сделать это:
Вы также можете иметь структуру данных Python, а не просто строку:
Или вы можете использовать атрибуты функции для проверки вызываемых значений:
Печать
источник
Как уже отмечалось в других ответах,
->
символ используется как часть аннотаций функций. В более поздних версиях Python>= 3.5
, однако, он имеет определенное значение.PEP 3107 - Аннотации функций описывают спецификацию, определяя грамматические изменения, существование,
func.__annotations__
в котором они хранятся, и тот факт, что их вариант использования все еще открыт.В Python,
3.5
однако, PEP 484 - подсказки типов придает этому значение единственное значение:->
используется для указания типа, который возвращает функция. Похоже, что это будет применяться в будущих версиях, как описано в разделе Как насчет существующих применений аннотаций :(Акцент мой)
На самом деле это не было реализовано с
3.6
Насколько я могу судить, поэтому оно может быть затронуто будущими версиями.В соответствии с этим, пример, который вы предоставили:
будет запрещено в будущем (и в текущих версиях будет сбивать с толку), его необходимо изменить на:
для того, чтобы эффективно описать, что функция
f
возвращает объект типаint
.Аннотации никак не используются самим Python, он в значительной степени заполняет и игнорирует их. Работать с ними могут сторонние библиотеки.
источник
В следующем коде:
-> int
просто говорит , чтоf()
возвращает целое число (но это не заставит функцию возвращать целое число). Это называется аннотацией возврата и может быть доступно какf.__annotations__['return']
.Python также поддерживает аннотации параметров:
: float
говорит людям, которые читают программу (и некоторые сторонние библиотеки / программы, например, pylint), которыеx
должны бытьfloat
. К нему обращаются какf.__annotations__['x']
, и он не имеет никакого значения сам по себе. Смотрите документацию для получения дополнительной информации:https://docs.python.org/3/reference/compound_stmts.html#function-definitions https://www.python.org/dev/peps/pep-3107/
источник
Это означает тип результата, который возвращает функция, но это может быть
None
.Он широко распространен в современных библиотеках, ориентированных на Python 3.x.
Например, это есть в коде библиотеки pandas-profiling во многих местах, например:
источник
def function(arg)->123:
Это просто тип возвращаемого значения, в данном случае целое число не имеет значения, какое число вы пишете.
как Java :
Но для Python (как сказал Джим Фасаракис Хиллиард ) возвращаемый тип - это просто подсказка , поэтому он предлагает возврат, но в любом случае разрешает возвращать другой тип, например, строку.
источник
Мое резюме:
Просто
->
вводится, чтобы заставить разработчиков по желанию указать тип возвращаемого значения функции. См. Предложение по улучшению Python 3107Это признак того, как все может развиваться в будущем, так как Python получил широкое распространение - признак строгой типизации - это мое личное наблюдение.
Вы также можете указать типы для аргументов. Указание типа возврата функций и аргументов поможет уменьшить логические ошибки и улучшить усовершенствования кода.
Вы можете иметь выражения как тип возвращаемого значения (для обоих на функции и уровне параметров) , а результат выражений можно получить с помощью аннотаций объекта атрибута «возврата». аннотации будут пустыми для выражения / возвращаемого значения для встроенных лямбда-функций.
источник