TLDR: вам нужно TypeVar
для возвращаемого типа вызова t
:
def fun(t: Callable[[int], R]) -> R:
...
Ограничение на тип здесь слишком ограничено. Функция принимает любые Callable
, которые принимают целое число, и тип возвращаемого значения функции - Callable
. Это можно указать, используя TypeVar
для возвращаемого типа:
from typing import Callable, TypeVar
R = TypeVar('R') # the variable return type
def fun(t: Callable[[int], R]) -> R:
return t(42)
fun(int) # Revealed type is 'builtins.int*'
fun(float) # Revealed type is 'builtins.float*'
reveal_type(fun(lambda x: str(x))) # Revealed type is 'builtins.str*'
Это также работает для типов, потому что создание экземпляра типа является вызовом.
Если более сложная подпись, например с ключевыми словами, необходимо, используйте Protocol
(из typing
или typing_extensions
).
Обратите внимание, что если один явно хочет передать только 42
Callable
, Literal
(от typing
или typing_extensions
) могут использоваться для указания этого.
R = TypeVar('R')
def fun(t: Callable[[Literal[42]], R]) -> R:
return t(42)
Обратите внимание, что любая функция типа Callable[[int], R]
также удовлетворяет Callable[[Literal[42]], R]
.