リストの内包と例外を使用していますか?
-
06-09-2019 - |
質問
オーケー、私はリストを持っている、と私はそのリストが別のリスト内に存在するかどうかを確認したいと言うことができます。私はこれを行うことを行うことができます:
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
ループを書くのいくつかの既存のリスト - すばらしいスタイルのないの汎用の方法に基づいてリストを作成するための構文的に簡潔な方法です。この例では、実際にリストを作成していないので、リストの内包表記を使用するために、任意の意味をなさないます。
他のヒント
あなたはリスト内包で昇給を使用することはできません。あなたは、Python言語リファレンス
あなたは重複と値を考慮したくない場合は、ハッシュ可能ですセットを使用します。彼らはより速く、より簡単だし、一回の操作で欠落している「すべて」の要素を抽出することができます:required_values = set('abc') # store this as a set from the beginning
values = set('ab')
missing = required_values - values
if missing:
raise SomeException('The values %r are not in %r' %
(missing, required_values))
別の(醜い)可能性が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)