Вы можете вроде как в Python 3.6 и выше использовать аннотации переменных PEP 526 . Вы можете аннотировать переменную, которой вы назначаете lambda
результат, с помощью typing.Callable
универсального :
from typing import Callable
func: Callable[[str, str], int] = lambda var1, var2: var1.index(var2)
Это не прикрепляет информацию о типе к самому объекту функции, а только к пространству имен, в котором вы сохранили объект, но обычно это все, что вам нужно для целей подсказки типа.
Однако вместо этого вы можете просто использовать оператор функции; Единственное преимущество, которое lambda
предлагает предложение, состоит в том, что вы можете поместить определение функции для простого выражения внутри более крупного выражения. Но указанная выше лямбда не является частью более крупного выражения, это только часть оператора присваивания, связывающего его с именем. Это именно то, чего def func(var1: str, var2: str): return var1.index(var2)
можно достичь с помощью заявления.
Обратите внимание, что вы не можете аннотировать *args
или **kwargs
аргументы отдельно, как указано в документации для Callable
:
Не существует синтаксиса для указания необязательных аргументов или аргументов ключевого слова; такие типы функций редко используются как типы обратного вызова.
Это ограничение не распространяется на протокол PEP 544 с методом__call__
; используйте это, если вам нужно выразительное определение того, какие аргументы следует принимать. Вам нужен Python 3.8 или установите typing-extensions
проект для резервного копирования:
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
Для lambda
выражения самого , вы не можете использовать любые аннотации ( с синтаксисом , на котором строится тип намекая Пайтон). Синтаксис доступен только для def
операторов функций.
Из PEP 3107 - Аннотации функций :
Синтаксис лямбды не поддерживает аннотации. Синтаксис лямбда-выражения можно изменить для поддержки аннотаций, установив скобки вокруг списка параметров. Однако было решено не вносить это изменение, потому что:
- Это было бы несовместимое изменение.
- Лямбды все равно кастрированы.
- Лямбда всегда можно изменить на функцию.
Вы по-прежнему можете прикреплять аннотации непосредственно к объекту, function.__annotations__
атрибут является записываемым словарем:
>>> 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'>}
Конечно, не то, чтобы подобные динамические аннотации помогли вам, когда вы захотели запустить статический анализатор над подсказками типа.