0

関数が成功時に 2 つの値のリストまたはタプルを返し、失敗時に False を返す場合、False をチェックしながら、戻り値のリストを 2 つの変数に展開するにはどうすればよいでしょうか?

def get_key_value():
  if (cond != True):
    return False
  return [val1, val2]

# Call it
# How can I also check for False while unpacking?
key, value = get_key_value()
4

4 に答える 4

4

@Felix Kling の素晴らしいコメントを回答に変換します。

(キー、値) ペアが見つからないことが何らかのシステム障害を示している場合は、例外をスローすることをお勧めします。失敗が標準の例外のいずれにも当てはまらない場合は、独自の新しい例外タイプを作成する必要があります。

cond != Trueと書いたほうがよいnot cond。また、必要がなければリストを作成しない方がよいでしょう。

class DataNotFound(Exception): pass

def get_key_value():
  if not cond:
    raise DataNotFound("Couldn't find it!")
  return val1, val2

try:
    key,value = get_key_value()
except DataNotFound:
    #handle the failure somehow
    key, value = 'ERROR', 'ERROR'
于 2011-03-10T21:38:34.923 に答える
3

これは、Python の「許可よりも許しを求めやすい」ポリシーに該当します。他に予期しない問題が発生した場合に備えて、関数で TypeError をキャッチすることは避けます。

data = get_key_value()
try:
   key, value = data
except TypeError:
   #handle the failure somehow
   key, value = 'ERROR', 'ERROR'
于 2011-03-10T21:30:25.707 に答える
1

これを行うための慣用的な方法はないと思います。特に、そのように動作する関数自体が単項的であるためです。それをしなければならない場合は、2要素のリストまたはタプルが「偽の」値ではなく「真実の」値であるという事実を利用することをお勧めします(これはPythonの用語ではありませんが、便利です):

pair_or_false = get_key_value()
if pair:
    key,value = val
else:
    # handle failure in whatever way

明らかな代替手段は、見つからないケースを例外として扱うことです。

try:
    key,value = get_key_value()
except TypeError:
    # deal with not-found case

しかし、アンパックの失敗以外の何かが TypeError を発生させる可能性がまったくある場合は、本物のエラーをそのように隠すリスクがあります。

于 2011-03-10T21:30:29.787 に答える
1

戻り値の型が混在しているため、問題が発生しています。できるからといって、そうすべきだというわけではありません。

ここでは例外が適切な方法の 1 つであるという点で他の人に同意しますが、ほとんどの場合、有効なキーと値を見つけることが期待されるかどうかによって異なります。その場合は、例外 ( のようなものKeyError) を使用して、関数が失敗したことを示します。ただし、高い割合で失敗することが予想される場合は、例外のオーバーヘッドが必要ない場合があります。その場合、[None, None]fromのようなものを返すget_key_valueと、呼び出しコードは次のようになります。

key, value = get_key_value()
if key:
    # take action
else:
    # handle the error appropriately
于 2011-03-10T21:48:12.283 に答える