Обновил ли Python 3.9, как вводить подсказку типа функции?

#python #python-3.x #type-hinting #python-typing #python-3.9

#python #python-3.x #тип-подсказка #python-typing #python-3.9

Вопрос:

До 3.9 я бы использовал это:

 from typing import Callable

def my_function(argument_function: Callable) -> None:
 

Теперь я больше не уверен.

В PEP 585 есть список устаревших типов ввода, который не включает typing.Callable , но включает collections.abc.Callable . До сих пор я не использовал модуль collections.abs, но мне интересно, typing.Callable может ли это быть связано с collections.abc.Callable тем, что Callable подсказка типа также устарела.

Я попробовал это:

 def my_function(argument_function: callable) -> None:
 

И это работает.

Но действительно ли это правильный путь сейчас? Или мне все еще нужно импортировать typing.Callable ?

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

1. Нет, callable это не тип.

2. Если они намеревались отказаться от ввода. Вызываемый, они бы устарели от ввода. Вызываемый. Этот PEP конкретно касается уменьшения избыточности — они не хотят, чтобы два вызываемых объекта в двух разных местах означали одно и то же.

3. «И это работает». Что вы подразумеваете под «это работает»? Это, конечно, не принято, скажем, mypy и это определенно не является частью спецификации

4.Это мало что значит. Код будет выполняться, если вы использовали что угодно, например def my_function(argument_function: sum) -> None: , несмотря sum на то, что это недопустимая аннотация типа. Если вы проверите вышеизложенное с помощью mypy, полуофициальной проверки статических типов, вы получите error: Function "builtins.callable" is not valid as a type … потому что, как я уже говорил ранее, callable это не тип

5. Да, и вам, вероятно, следует использовать форму fll, Callable[[ArgTypes], ReturnType]

Ответ №1:

Поскольку ответа нет, я повышаю комментарий juanpa.arrivillaga до ответа. Цитируя приведенный выше комментарий [так в оригинале]:

вероятно, вам следует использовать форму fll, Callable[[ArgTypes], ReturnType]

Или конкретизировать его:

 from typing import Callable

# Let's say this was an example of argument_function and that's 
# the signature that you expect in my_function

def foo(x: int) -> str:
    return str(x)

def my_function(argument_function: Callable[[int], str]) -> None:
    pass