Sie können in Python 3.6 und höher mithilfe von PEP 526-Variablenanmerkungen arbeiten . Sie können die Variable, der Sie das lambda
Ergebnis zuweisen , mit dem typing.Callable
Generikum versehen :
from typing import Callable
func: Callable[[str, str], int] = lambda var1, var2: var1.index(var2)
Dadurch werden die Typhinweisinformationen nicht an das Funktionsobjekt selbst angehängt, sondern nur an den Namespace, in dem Sie das Objekt gespeichert haben. Dies ist jedoch normalerweise alles, was Sie für Typhinweiszwecke benötigen.
Sie können jedoch auch einfach eine Funktionsanweisung verwenden. Der einzige Vorteil eines lambda
Angebots besteht darin, dass Sie eine Funktionsdefinition für einen einfachen Ausdruck in einen größeren Ausdruck einfügen können. Das obige Lambda ist jedoch nicht Teil eines größeren Ausdrucks, sondern immer nur Teil einer Zuweisungsanweisung, die es an einen Namen bindet. Genau das würde eine def func(var1: str, var2: str): return var1.index(var2)
Aussage bewirken.
Beachten Sie, dass Sie auch keine Anmerkungen *args
oder **kwargs
Argumente separat erstellen können, wie in der Dokumentation für folgende Callable
Zustände angegeben:
Es gibt keine Syntax, um optionale oder Schlüsselwortargumente anzugeben. Solche Funktionstypen werden selten als Rückruftypen verwendet.
Diese Einschränkung gilt nicht für ein PEP 544- Protokoll mit einer __call__
Methode . Verwenden Sie diese Option, wenn Sie eine aussagekräftige Definition benötigen, welche Argumente akzeptiert werden sollen. Sie benötigen Python 3.8 oder installieren das typing-extensions
Projekt für einen Backport:
from typing-extensions import Protocol
class SomeCallableConvention(Protocol):
def __call__(var1: str, var2: str, spam: str = "ham") -> int:
...
func: SomeCallableConvention = lambda var1, var2, spam="ham": var1.index(var2) * spam
Für den lambda
Ausdruck selbst können Sie keine Anmerkungen verwenden (die Syntax, auf der Pythons Typhinweise basieren). Die Syntax ist nur für def
Funktionsanweisungen verfügbar .
Aus PEP 3107 - Funktionsanmerkungen :
Die Syntax von Lambda unterstützt keine Anmerkungen. Die Syntax von Lambda kann geändert werden, um Anmerkungen zu unterstützen, indem Klammern um die Parameterliste erforderlich sind. Es wurde jedoch beschlossen , diese Änderung nicht vorzunehmen, weil:
- Es wäre eine inkompatible Änderung.
- Lambdas sind sowieso kastriert.
- Das Lambda kann immer in eine Funktion geändert werden.
Sie können die Anmerkungen weiterhin direkt an das Objekt anhängen. Das function.__annotations__
Attribut ist ein beschreibbares Wörterbuch:
>>> def func(var1: str, var2: str) -> int:
... return var1.index(var2)
...
>>> func.__annotations__
{'var1': <class 'str'>, 'return': <class 'int'>, 'var2': <class 'str'>}
>>> lfunc = lambda var1, var2: var1.index(var2)
>>> lfunc.__annotations__
{}
>>> lfunc.__annotations__['var1'] = str
>>> lfunc.__annotations__['var2'] = str
>>> lfunc.__annotations__['return'] = int
>>> lfunc.__annotations__
{'var1': <class 'str'>, 'return': <class 'int'>, 'var2': <class 'str'>}
Nicht, dass dynamische Annotationen wie diese Ihnen helfen würden, wenn Sie einen statischen Analysator über Ihre Typhinweise ausführen möchten.