Python 3.6 ve üzeri sürümlerde PEP 526 değişken ek açıklamalarını kullanarak bunu yapabilirsiniz . Sonucu atadığınız değişkene jeneriklambda ile açıklama ekleyebilirsiniz :typing.Callable
from typing import Callable
func: Callable[[str, str], int] = lambda var1, var2: var1.index(var2)
Bu, tür ipucu bilgisini işlev nesnesinin kendisine değil, yalnızca nesneyi içinde sakladığınız ad alanına iliştirir, ancak genellikle tür ipucu amacıyla ihtiyacınız olan tek şey budur.
Bununla birlikte, bunun yerine bir işlev deyimi de kullanabilirsiniz; Bir lambdateklifin tek avantajı, daha büyük bir ifadenin içine basit bir ifade için bir işlev tanımı koyabilmenizdir . Ancak yukarıdaki lambda daha büyük bir ifadenin parçası değildir, yalnızca bir atama ifadesinin bir parçasıdır ve onu bir isme bağlar. Bir def func(var1: str, var2: str): return var1.index(var2)ifadenin tam olarak elde edeceği şey budur .
Eyaletler için dokümantasyon olarak ayrıca açıklama *argsveya **kwargsargüman ekleyemeyeceğinizi unutmayın Callable:
İsteğe bağlı veya anahtar kelime bağımsız değişkenlerini gösteren bir sözdizimi yoktur; bu tür işlev türleri nadiren geri arama türleri olarak kullanılır.
Bu sınırlama, bir yöntem içeren bir PEP 544 protokolü__call__ için geçerli değildir ; hangi argümanların kabul edilmesi gerektiğine dair anlamlı bir tanıma ihtiyacınız varsa bunu kullanın. Python 3.8'e ihtiyacınız var veya bir backport için typing-extensionsprojeyi kurmanız gerekiyor :
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
İçin lambdaİfade kendisi , herhangi bir ek açıklamaları (Python'un tip ipucu inşa edildiği sözdizimi) kullanamazsınız. Sözdizimi yalnızca defişlev ifadeleri için kullanılabilir .
Gönderen - PEP 3107 Fonksiyon Ek Açıklamalar :
lambda'nın sözdizimi ek açıklamaları desteklemez. Lambda'nın sözdizimi, parametre listesinin etrafına parantezler eklenerek açıklamaları desteklemek için değiştirilebilir. Ancak bu değişikliğin yapılmamasına karar verildi çünkü:
- Uyumsuz bir değişiklik olur.
- Lambda'lar yine de kısırlaştırıldı.
- Lambda her zaman bir işleve dönüştürülebilir.
Ek açıklamaları yine de doğrudan nesneye ekleyebilirsiniz, function.__annotations__nitelik yazılabilir bir sözlüktür:
>>> 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'>}
Elbette yazım ipuçlarınız üzerinde bir statik analizci çalıştırmak istediğinizde, bunlar gibi dinamik ek açıklamalar size yardımcı olmayacak.