ラムダ関数内で try catch ブロックを使用することは可能ですか? 特定の変数を整数に変換するにはラムダ関数が必要ですが、すべての値を整数に変換できるわけではありません。
5 に答える
いいえ。Python ラムダは、単一の式のみにすることができます。名前付き関数を使用します。
型を変換するためのジェネリック関数を書くと便利です:
def tryconvert(value, default, *types):
for t in types:
try:
return t(value)
except (ValueError, TypeError):
continue
return default
次に、ラムダを書くことができます:
lambda v: tryconvert(v, 0, int)
変換する値を取る関数を返すtryconvert()
ように書くこともできます。その後、ラムダは必要ありません:
def tryconvert(default, *types):
def convert(value):
for t in types:
try:
return t(value)
except (ValueError, TypeError):
continue
return default
# set name of conversion function to something more useful
namext = ("_%s_" % default) + "_".join(t.__name__ for t in types)
if hasattr(convert, "__qualname__"): convert.__qualname__ += namext
convert.__name__ += namext
return convert
値を受け取ってそれを整数に変換するtryconvert(0, int)
関数を返し、これができない場合は返すようになりました。この関数はすぐに使用できます (コピーを保存しません)。convert_0_int
0
mynumber = tryconert(0, int)(value)
または、後で呼び出すために保存します。
intconvert = tryconvert(0, int)
# later...
mynumber = intconvert(value)
try
この特定のインスタンスでは、次のようなブロックの使用を避けることができます。
lambda s: int(s) if s.isdigit() else 0
のすべての文字が数字の場合、 isdigit()
string メソッドは true を返します。(負の数を受け入れる必要がある場合は、追加のチェックを行う必要があります。)s
必要に応じて、別のアプローチとして、try:catch をラムダ fn の外に置くこともできます。
toint = lambda x : int(x)
strval = ['3', '']
for s in strval:
try:
print 2 + toint(s)
except ValueError:
print 2
出力:
5
2
ラムダ式で例外を処理する一般的な方法はありませんが、少なくとも 1 種類の例外に対して制限付きの方法で処理できます。StopIteration
式の一部から a をスローし、別の部分でキャッチすることは可能です。見る:
from random import randrange
list((lambda:(yield from (randrange(0,2) or next(iter(())) for _ in (None,))))())
しばらくnext(iter(()))
レイズするとそれがキャッチされます。上記の式は、内部のランダムな値に従ってorをランダムに返します (aは例外を発生させ、aは通常どおり評価されます)。StopIteration
yield from
[]
[1]
0
1
詳細については、http://baruchel.github.io/python/2018/06/20/python-exceptions-in-lambda/を参照してください。