Ich möchte Typhinweise in meinem aktuellen Python 3.5-Projekt verwenden. Meine Funktion sollte eine Funktion als Parameter erhalten.
Wie kann ich die Typfunktion in meinen Typhinweisen angeben?
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
Ich habe PEP 483 überprüft , konnte dort jedoch keinen Hinweis auf einen Funktionstyp finden.
Callable
Antworten:
Wie @jonrsharpe in einem Kommentar feststellte, kann dies folgendermaßen geschehen
typing.Callable
:Das Problem ist,
Callable
dass für sich genommen übersetzt wird,Callable[..., Any]
was bedeutet:Ein Callable akzeptiert eine beliebige Anzahl von / type von Argumenten und gibt einen Wert von einem beliebigen Typ zurück. In den meisten Fällen ist dies nicht das, was Sie wollen, da Sie so gut wie jede Funktion übergeben können. Sie möchten, dass auch die Funktionsparameter und Rückgabetypen angedeutet werden.
Aus diesem Grund wurden viele
types
intyping
überlastet, um Subskripte zu unterstützen, die diese zusätzlichen Typen kennzeichnen. Wenn Sie beispielsweise eine Funktion hattensum
, die zweiint
Sekunden benötigt und Folgendes zurückgibtint
:Ihre Anmerkung dazu wäre:
Das heißt, die Parameter werden im äußeren Abonnement mit dem Rückgabetyp als zweitem Element im äußeren Abonnement subskriptiert. Allgemein:
quelle
typing
Zeug bringt die gesamte Python-Sprache um eine Stufe nach oben.Callable[[Arg, Types, Here], ...]
für*args
,**kwargs
, Keyword-only args und Positions nur args? Haben sie nicht darüber nachgedacht, Konventionen in den Typensignaturen für Callables aufzurufen? ;)Ein weiterer interessanter Punkt ist, dass Sie die eingebaute Funktion verwenden können
type()
, um den Typ einer eingebauten Funktion abzurufen und diese zu verwenden. Also könntest du habenOder so etwas
quelle
builtin_function_or_method
alsmy_function
? Würde das nichtlambda
funktionieren? Eine benutzerdefinierte Funktion oder gebundene Methode?