質問

オーケー、私はリストを持っている、と私はそのリストが別のリスト内に存在するかどうかを確認したいと言うことができます。私はこれを行うことを行うことができます:

all(value in some_map for value in required_values)

どの正常に動作しますが、私は必要な値が欠落しているとき、それが欠落していることを値で、例外を発生させるにしたいと言うことができます。私は、リストの内包表記を使用していることをどのように行うことができますか?

私は、多かれ少なかれ興味、すべての兆候は何を指していないように見える。

の編集のカワイイ私はこのことを意味します:

for value in required_values:
 if value not in some_map:
  raise somecustomException(value)

私は、エラーが発生した場所を私は値を見つけることができる方法を見て傾けるものを見てみる。

役に立ちましたか?

解決

  

私は、必要な値が欠落しているとき、それが欠落していることを値で、例外を発生させるにしたいと言うことができます。どのように私は行うことができ、そのリストの内包表記を使用していますか?

リストの内包表記は、単一の行の任意のforループを書くのいくつかの既存のリスト - すばらしいスタイルのないの汎用の方法に基づいてリストを作成するための構文的に簡潔な方法です。この例では、実際にリストを作成していないので、リストの内包表記を使用するために、任意の意味をなさないます。

他のヒント

別の(醜い)可能性がerror_on_false関数を次のようになります。

def error_on_false(value)
    if value:
        return value
    else:
        raise Exception('Wrong value: %r' % value)

if all(error_on_false(value in some_map) for value in required_values):
    continue_code()
    do_something('...')

これは醜いです。私の代わりにsetを使用すると思います。

私は今夜疑問を抱きました。私のユースケースは、オブジェクトのリストを反復処理し、オブジェクトが特定の型ではなかったときにエラーを上げています。私のソリューションは、発電機を使用することです。

def iter_my_class(my_class_list):
    for c in my_class_list:
        if not isinstance(c, MyClass):
            raise ValueError('Expected MyClass')
        yield c

次に

として使用
classes = [c for c in iter_my_class(my_class_list)]

私は自分の携帯電話上でこれを書いています。それがエラーなしで実行された場合、あなたのすべては私にビールを負っています。

あなたは確かに一緒に何かをハックすることができますが、それは特に読めない。

(_ for _ in ())は、あなたが望む任意の例外を発生させるthrowメソッドを使用することができ、そこから発電機を、定義します。

all((_ for _ in ()).throw(somecustomException(value)) for value in required_values if value not in some_map)

とはいえ、読みやすさはさておき、それはあなたが実際にリストを使用するつもりがない限り、リストの内包表記を使用しても意味がありません。このようなものとして、より多くの意味を作るかもしれません。

map_values=[some_map[value] if value in some_map else (_ for _ in ()).throw(somecustomException(value)) for value in required_values]

しかし、たとえ、それはおそらく、ループの外に例外を処理するために、より理にかなっています。あなたには、いくつかの理由のためのカスタム例外を発生する場合は、単にKeyError例外をキャッチし、独自の例外を発生させることができます。

try:
    found_values=[some_map[value] for value in required_values]
except KeyError as e:
    raise somecustomException(e.args[0])

私は(noskloの例のように)セット優れているを使用してだと思いますが、あなたはこのような単純な何かを行うことができます:

def has_required(some_map, value):
  if not value in some_map:
    raise RequiredException('Missing required value: %s' % value)

all(has_required(some_map, value) for value in required_values)
scroll top