Como @jonrsharpe observou em um comentário, isso pode ser feito com typing.Callable:
from typing import AnyStr, Callable
def my_function(name: AnyStr, func: Callable) -> None:
O problema é que, Callablepor si só, é traduzido para o Callable[..., Any]que significa:
Um chamador pega qualquer número de / tipo de argumentos e retorna um valor de qualquer tipo. Na maioria dos casos, isso não é o que você deseja, pois permitirá que praticamente qualquer função seja aprovada. Você deseja que os parâmetros de função e tipos de retorno também sejam sugeridos.
É por isso que muitos types de typingter sido sobrecarregado para suporte sub-scripting que denota estes tipos extras. Portanto, se, por exemplo, você tivesse uma função sumque recebe dois se intretorna um int:
def sum(a: int, b: int) -> int: return a+b
Sua anotação seria:
Callable[[int, int], int]
ou seja, os parâmetros são subcriptografados na assinatura externa com o tipo de retorno como o segundo elemento na assinatura externa. Em geral:
Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType]
Callable