#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