Python 3.6以降では、PEP526変数アノテーションを使用できます。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
。
オプションまたはキーワード引数を示す構文はありません。このような関数タイプがコールバックタイプとして使用されることはめったにありません。
この制限は、メソッドを使用するPEP544プロトコルに__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
表現自体は、任意の注釈(Pythonのタイプヒンティングが構築されているシンタックス)を使用することはできません。構文は、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'>}
もちろん、タイプヒントに対して静的アナライザーを実行したい場合は、このような動的アノテーションが役立つわけではありません。