2013-07-19 9 views
9

私は、Python dictからローカル値にいくつかの値を抽出する洗練された方法を探しています。限定されたdict値をPythonのローカル変数に展開するための優雅な方法

これと同等の何かが、値の長いリストのために、より長いキー/変数名のクリーナー:

d = { 'foo': 1, 'bar': 2, 'extra': 3 } 
foo, bar = d['foo'], d['bar'] 

私はもともと、次のようなものを期待していた:

foo, bar = d.get_tuple('foo', 'bar') 

私は簡単に悪くない関数を書くことができます:

def get_selected_values(d, *args): 
    return [d[arg] for arg in args] 

foo, bar = get_selected_values(d, 'foo', 'bar') 

他の組み込みの方法があることを疑っている。

+2

申し訳ありませんが、*なぜ*したいですか? –

+0

私が以前に取り組んでいたスコープとコンテキストについての質問を見る価値があるかもしれません:を実行します。これはあなたにとって不幸なことかもしれませんが、特定のデータ構造から解凍されたデータオブジェクトを扱うことができ、数学演算をそれらに適用する構文を大幅に簡素化することができました。 – ely

+0

かなり複雑なルーティングロジックにとって3-4の値が重要ですが、元の構造を最終処理に渡すだけで済むJSON構造を処理しています。 – DonGar

答えて

20

あなたは、いくつかのタイピングを保存することが

foo, bar = map(d.get, ('foo', 'bar')) 

または

foo, bar = itemgetter('foo', 'bar')(d) 

このような何かを、本質的に(良いことです)何をやっていると同じであることができます。

+6

また、 'foo、bar = itemgetter( 'foo'、 'bar')(d)' –

+0

@JonClementsを使うといいです。 –

+0

私は@DSMがそれを別の答えとして書いていたことに気付かなかったので、私は今や罪悪感を感じています... –

1

やや恐ろしい、しかし:これは可能であるがこと

globals().update((k, v) for k, v in d.iteritems() if k in ['foo', 'bar']) 

は注意、 - あなただけの内側に残されるべき名前空間を汚染することがありますよう、それはあなたが本当にやっているしたくない何かdictそのもの...

+5

私はエレガントでも良いアイディアでもないと思います。 – Marcin

+0

@Marcin私は同意します...もう少し明示するためにメモを追加します... –

1

名前を前もって知っていれば、あなたの提案通りにできます。

あなたがそれらを事前に知らない場合は、dictを使うことに固執します。それが彼らの目的です。

あなたが主張する場合、代替は次のようになります。

varobj = object() 
for k,v in d.iteritems(): setattr(varobj,k,v) 

れた後のキーがvarobj上の変数になります。

+1

ああ、謎のdownvoter、私はあなたが何が間違っていると言うことはできません。 – Marcin

+1

質問の範囲は、「あなたが主張するならば」のようなコメントを要求も要求もしません。「OPがリスクを認識していると仮定するのは安全だと思う(あるいは、リスクの議論が、答えではなく、コメント領域に質問に行くことができる)。特定の名前のローカル変数を作成するという目標を達成してください。ベストプラクティスの推奨事項で何も修飾されないように、回答の色調を変更したい場合は、一度投票を変更してもよろしいです – ely

+1

@EMS申し訳ありませんが、OPに彼がやりたいことを伝えなければならないというルールはありません。それは良いアイデアかどうかを評価することなく、正直言ってあなたの態度はあまりにも攻撃的で、 – Marcin

関連する問題