1

私はステートメントを除いてこの長い試行リストを持っています:

    try:
       uri = entry_obj['media$group']['media$content'][0]['url']
    except (KeyError, IndexError):
       uri = None
    try:
       position = entry_obj['yt$position']['$t']
    except KeyError:
       position = None
    try:
       description = entry_obj['content']['$t']
    except KeyError:
       description = None
    try:
       seconds = entry_obj['media$group']['yt$duration']['seconds']
    except KeyError:
       seconds = None
    try:
       thumbnails = entry_obj['media$group']['media$thumbnail']
    except KeyError:
       thumbnails = None

これを書くためのより簡潔な方法はありますか?

4

3 に答える 3

9

呼び出しのデフォルト値に何を使用するかを理解するのにうんざりしている場合はget()、ヘルパー関数を作成するだけです。

def resolve(root, *keys):
   for key in keys:
       try:
           root = root[key]
       except (KeyError, IndexError):
           return None
   return root

次に、次のように記述します。

uri = resolve(entry_obj, 'media$group', 'media$content', 0, 'url')

呼び出しを少し単純化するために、ヘルパー関数を強化して、キーの単一の文字列を取得し、スペースで分割することができます。そうすれば、それほど多くの引用符を入力する必要がなく、デフォルト値の引数を追加することもできます。

def resolve(root, keys, default=None):
    for key in keys.split():
        try:
            root = root[key]
        except (TypeError, KeyError):
            try:
                root = root[int(key)]
            except (IndexError, ValueError, KeyError):
                return default

uri = resolve(entry_obj, 'media$group media$content 0 url', '')
于 2012-06-07T04:42:27.817 に答える
2

私はこれを行う別の良い方法を考えましたが、kindallの方法とどのように比較されるかわかりません。まず、メソッドプロパティを定義します。

def res(self, property):
    try:
        return property()
    except (KeyError, IndexError):
        return None

次に、try-exceptステートメントを次のように置き換えます。

    url = res(lambda: entry_obj['media$group']['media$content'][0]['url'])
    position = res(lambda: entry_obj['yt$position']['$t'])
    description = res(lambda: entry_obj['content']['$t'])
    duration = res(lambda: entry_obj['media$group']['yt$duration']['seconds'])
    thumbnails = res(lambda: entry_obj['media$group']['media$thumbnail'])
于 2012-06-10T02:09:58.543 に答える
1

get代わりに辞書の方法を使用してください。

position = entry_object.get('yt$position').get('$t')

getキーが存在しない場合を処理し、その場合は代わりに(変更可能な)フォールバック値を提供します。最初の処理は手動で行う必要がありますが、残っIndexErrorているものはすべてexcept KeyError:消えます。

于 2012-06-07T04:31:36.300 に答える