Chcę użyć wskazówek dotyczących typów w moim bieżącym projekcie Python 3.5. Moja funkcja powinna otrzymać funkcję jako parametr.
Jak mogę określić funkcję typu w moich wskazówkach dotyczących typu?
import typing
def my_function(name:typing.AnyStr, func: typing.Function) -> None:
# However, typing.Function does not exist.
# How can I specify the type function for the parameter `func`?
# do some processing
pass
Sprawdziłem PEP 483 , ale nie mogłem tam znaleźć podpowiedzi typu funkcji.
Callable
Odpowiedzi:
Jak zauważył @jonrsharpe w komentarzu, można to zrobić za pomocą
typing.Callable
:Problem w tym,
Callable
że sam jest tłumaczony naCallable[..., Any]
co oznacza:Funkcja wywoływana przyjmuje dowolną liczbę argumentów / typ i zwraca wartość dowolnego typu. W większości przypadków nie jest to to, czego chcesz, ponieważ pozwolisz na przekazanie prawie każdej funkcji. Chcesz, aby parametry funkcji i typy zwracane były również wskazywane.
Dlatego wiele
types
ztyping
nich zostało przeciążonych, aby obsługiwać podskrypty, które oznaczają te dodatkowe typy. Więc jeśli na przykład masz funkcję,sum
która zajmuje dwieint
sekundy i zwracaint
:Twoja adnotacja będzie wyglądać tak:
oznacza to, że parametry są subskryptowane w subskrypcji zewnętrznej, a typ zwracany jest drugim elementem w subskrypcji zewnętrznej. Ogólnie:
źródło
typing
rzecz przenosi cały język Pythona o jeden stopień wyżej.Callable[[Arg, Types, Here], ...]
za*args
,**kwargs
, słowa kluczowe tylko args i pozycyjnych tylko args? Czy nie myśleli o wywołaniu konwencji w podpisach czcionek dla wywołań? ;)Inną interesującą kwestią, na którą należy zwrócić uwagę, jest to, że możesz użyć funkcji wbudowanej,
type()
aby uzyskać typ funkcji wbudowanej i użyć jej. Więc mogłeśAlbo coś w tej formie
źródło
builtin_function_or_method
jakomy_function
? Nie byłobylambda
pracy? Funkcja zdefiniowana przez użytkownika lub metoda powiązana?