62

ラムダ関数内で try catch ブロックを使用することは可能ですか? 特定の変数を整数に変換するにはラムダ関数が必要ですが、すべての値を整数に変換できるわけではありません。

4

5 に答える 5

96

いいえ。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_int0

mynumber = tryconert(0, int)(value)

または、後で呼び出すために保存します。

intconvert = tryconvert(0, int)
# later...
mynumber = intconvert(value)
于 2012-09-16T23:23:24.340 に答える
38

tryこの特定のインスタンスでは、次のようなブロックの使用を避けることができます。

lambda s: int(s) if s.isdigit() else 0

すべての文字が数字の場合、 isdigit()string メソッドは true を返します。(負の数を受け入れる必要がある場合は、追加のチェックを行う必要があります。)s

于 2012-09-16T23:25:15.647 に答える
1

必要に応じて、別のアプローチとして、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
于 2015-09-09T12:15:15.173 に答える
0

ラムダ式で例外を処理する一般的な方法はありませんが、少なくとも 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は通常どおり評価されます)。StopIterationyield from[][1]01

詳細については、http://baruchel.github.io/python/2018/06/20/python-exceptions-in-lambda/を参照してください。

于 2018-06-21T06:33:55.213 に答える