私が理解していることから、Pythonラムダはステートメントではなく式のみを許可します。ラムダ式で使用len()していて、関数呼び出しの戻り値の長さを取得しようとしている場合があります。ただし、その関数呼び出しは を返す可能性がありNone、これは を壊しlen()ます。これを回避する優雅な方法はありますか?
例:
def foo(obj_list, field):
return maxk(obj_list, key=lambda obj: len(nested_getattr(obj, field)))
上記のは、引数を受け入れるmaxk()バージョンです。私はPython 2.4を使用しています(現在はそれ以上のものを使用できません)ので、ここから入手したキー引数を取るカスタム実装があります(投稿#140122および#140143を参照)。 のように動作しますが、別の属性内にネストされた属性を取得できる別のユーティリティ関数です。それはhere から入手できます。max()keymax()nested_getattr()getattr()
サンプル関数 (これは、変数/名前を変更して使用している実際の関数です) が行うことは、オブジェクトのリスト ( obj_list) を調べて、値の長さを比較し、全体で最大fieldのリスト内のオブジェクトを返すことです。field
ただし、field各オブジェクトの で指定された属性が を返すNone場合、は .len()でチョークしTypeErrorます。インライン条件を使用してこれを回避できると思いますがnested_getattr()、チェックのために1回、戻り値が でない場合はおそらく2回、2回呼び出す必要がありNoneます。戻り値を変数にキャッシュし、それを条件付きで実行してから、何を返すかを決定したいと思います (または、ジェネレータ式で完全にスキップさせます)。
これを処理する良い方法は何ですか? 私は、この関数、、maxk()またはnested_getattr()(必要な場合) の他の実装を受け入れます。