Подсказки типа Python 3 для подписи функции - PullRequest
0 голосов
/ 04 июля 2018

Есть ли способ объявить сигнатуру объекта функции с подсказками типа Python (3.5+)? В частности, есть ли способ объявить, какой тип объекта функции может принимать функция или переменная может ссылаться.

Я уверен, что это может стать довольно запутанным (как это может быть с лямбда-типами C ++ 11, например), но есть ли хоть какой-нибудь способ проверить типы функций?

Например:

def func1(x: int) -> int:
    return x

def func2(x: int, y: int) -> int:
    return x + y

# 'TwoArgFn' is a 'function type' that accepts two ints and returns an int
def takes_two(f: TwoArgFn) -> int:
    return f(123, 456)

Передача func1 в качестве аргумента takes_two должна быть ошибкой, тогда как передача func2 - это нормально.

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Краткий ответ: нет встроенного способа принудительного применения объявления и проверки типов.

Как следует из названия, это тип hints , который может помочь программисту узнать, что передается в качестве аргументов, а что возвращается из функций (это может быть особенно полезно при чтении / просмотре больших файлов кода) , Однако, как можно увидеть здесь в этом посте от Гвидо, Юкки и Лукаша:

Следует также подчеркнуть, что Python останется динамически типизированным языком, и авторы не хотят когда-либо делать подсказки типов обязательными, даже по соглашению.

Так что, если вы ожидаете статически типизированных аргументов, которые будут вызывать ошибки, если переданные объекты не имеют требуемого типа, то вам не следует использовать python в первую очередь.

Однако у вас могут быть некоторые варианты: например, В IDE, таких как pycharm или Atom, есть плагины, которые будут проверять типы за вас.


Однако, если вы хотите просто получить подсказку типа для вызываемой функции без принудительной проверки, повышения ошибок или автоматической проверки, то проверьте ответ @dseuss:)

0 голосов
/ 04 июля 2018

Вы можете узнать сигнатуру пользовательской функции, используя аннотации функций. Но на самом деле это просто метаинформация. Он не применяет никаких правил проверки типов.

Вы можете использовать отдельную проверку типов строк в современных редакторах, таких как pycharm и т. Д. Эти проверки типов действуют как мощный линтер.

Как правило, Python остается динамически типизированным языком, и авторы не хотят когда-либо делать подсказки типов обязательными даже по соглашению. См. тип подсказки

0 голосов
/ 04 июля 2018

Для этой цели используйте тип typing.Callable (см. здесь ):

from typing import Callable

def takes_two(f: Callable[[int, int], int]) -> int:
    return f(123, 456)

Первый аргумент Callable - это список типов для аргументов функции, а второй аргумент - тип возвращаемого значения.

Конечно, сам Python вообще не проверяет типы. Для этого вы должны использовать дополнительные инструменты, такие как mypy

...