2015-11-20 3 views
11

は現在、Pythonの、関数のパラメータや戻り値の型に型が示唆することができます。ラムダ関数にヒントを入力することはできますか?次のように

def func(var1: str, var2: str) -> int: 
    return var1.index(var2) 

関数は2つの文字列を受け取り、整数を返すことを示しています。

しかし、この構文は次のようになりラムダ、と非常に紛らわしいです:

func = lambda var1, var2: var1.index(var2) 

私は両方のパラメータに型ヒントを入れてみましたし、型を返す、と私はそのように把握することはできませんしました構文エラーは発生しません。

ヒントにラムダ関数を入力できますか?もしそうでなければ、ヒンティング・ラムダ型の計画があるのか​​、それとも明白な構文の矛盾以外の何らかの理由があるのでしょうか?

+0

が、私は、ラムダのための通常の使用の場合は、別の関数内にネストされていることを考える(一箇所で定義されたと呼ばれている定期的な機能とは対照的どこか全く違う)。その関数の型をすでに知っていれば(原則として)、ラムダが受け取る型を調べるのはかなり簡単です。さらに、アノテーションをサポートするように構文を変更すると、ラムダ_ハードデアに読み込みされるだけです。 – mgilson

答えて

8

いいえ、注釈(Pythonの型ヒントが組み込まれている構文)をlambdaという式で使用することはできません。この構文は、def関数ステートメントでのみ使用できます。 PEP 3107 - Function Annotationsから

ラムダの構文は、注釈をサポートしていません。ラムダの構文は、パラメータリストの周りにかっこを必要とすることによって、注釈をサポートするように変更できます。ただし、was decidedは変更されません。

  • これは互換性のない変更です。
  • ラムダはいずれにせよ中和されている。
  • ラムダは常に関数に変更できます。

あなたはまだ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'>} 

は、これらのような動的な注釈はあなたを助けるために起こっているわけではありませんもちろん、あなたのタイプのヒントの静的なアナライザーです。

+0

ラムダのアノテーションを禁止することが意図的な選択だったかどうか知っていますか? –

+0

これは、関数型言語機能と命令型言語を混在させることで得られるものです。不必要、無意味です。 – pbhowmick

+0

@ NathanMerrill:それはどのように表現構文に適合するでしょうか?私は多くの点があるとは思わない、ユースケースはまったく異なっている。 –

4

のPython 3.6以来、あなたは(PEP 526を参照)することができます

from typing import Callable 
is_even: Callable[[int], bool] = lambda x: (x % 2 == 0) 
関連する問題