Страницы

Поиск по вопросам

понедельник, 28 января 2019 г.

Зачем нужен вызов “-> max(a,b)” при создании функции?

Нашёл такой пример: def function(a:int,b:str,c:list) -> max(2,3):. Зачем используется -> max(...)?


Ответ

В данной строке
def function(a:int,b:str,c:list) -> max(2,3):
:int, :str, :list, -> max(2,3) - это аннотации. Впервые они предлагаются к введению в Python в PEP 3107, но их назначение четко не регламентировалось (их интерпретация возлагалась на авторов сторонних инструментов).
В качестве аннотации может использоваться любое синтаксически верное выражение Python. При запуске кода интерпретатором выражения, используемые в качестве аннотации, исполняются (поэтому могут вызывать ошибки во время исполнения, например выражение def f() -> max(None, 1): pass вызовет ошибку TypeError, пример от jfs), но никаким специальным образом интерпретатором не обрабатываются (т.е., например, интерпретатор сам не проверяет типы).
Позже было более четко зафиксировано использование аннотаций как аннотаций типов (PEP 484), т.е. после аргументов функции через двоеточие пишем предполагаемый тип аргумента, после -> пишем тип возвращаемого значения функции.
Опять же, интерпретатор их игнорирует, но аннотации типов могут использоваться такими инструментами как mypy или встроенным в PyCharm статическим анализатором кода, чтобы понимать, что в функцию передано (или возвращено) значение не того типа, которое предполагалось, и отображать это как ошибку или предупреждение.
-> max(2,3) с моей точки зрения не несет никакой смысловой нагрузки. Это не аннотация типа, а просто аннотация. Что имел в виду автор примера - загадка. Скорее всего это просто пример использования аннотаций.
Программно получить доступ к аннотациям функции можно через атрибут функции __annotations__
def function(a:int,b:str,c:list) -> max(2,3): pass
print(function.__annotations__)
Результат:
{'a': , 'return': 3, 'c': , 'b': }
Здесь видны прописанные для аргументов типы, и видно, что выражение max(2,3) вычислилось, поэтому в качестве аннотации для возвращаемого значения записалось просто 3.

Комментариев нет:

Отправить комментарий