2013-07-19 24 views
9

'daki yerel değişkenlere açmak için şık bir yol Bazı Python dict değerlerini yerel değerlere çıkarmak için zarif bir yol arıyorum. Ve uzun anahtar/değişken adları için değerlerin daha uzun listesi için bu eşdeğerdir, ancak temizleyiciSınırlı dict değerlerini Python

şey:

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

Başlangıçta aşağıdaki gibi bir şey için umuyordum:

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

Kolayca kötü olmayan bir fonksiyon yazabilirim:

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

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

Ama ben Başka bir yerleşik yol olduğu şüphesiyle.

+2

Sorduğum için üzgünüm, ama * neden * bunu yapmak istersiniz? –

+0

Daha önce üzerinde çalıştığım kapsam ve kapsamlar hakkında bir soruya bakmak faydalı olabilir: . Bu sizin için çok fazla olabilir, ancak belirli veri yapılarından çıkarılan veri nesneleriyle çalışabilmem ve matematik işlemlerini onlara uygulamanın sözdizimini büyük ölçüde basitleştirebilmem için iyi bir çözümdü. – ely

+0

Oldukça karmaşık yönlendirme mantığı için 3-4 değerlerin önemli olduğu ancak orijinal yapının yalnızca son işleme geçirilmesi gereken JSON yapılarını ele alıyorum. – DonGar

cevap

20

Bazı yazmaktan kurtarır olabilir

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

veya

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

Bu böyle bir şey yapmak ama aslında (iyi bir şey olduğu) ne yapıyorsun aynıdır olabilir.

+6

Veya sadece 'foo, bar = itemgetter ('foo', 'bar') kullanın (d)' –

+0

@JonClements Bu hoş, OP bunu beğenecektir. –

+0

Şimdi farkettiğim gibi suçluluk duyuyorum @DSM bunu alternatif bir cevap olarak koymuştu ... –

1

Biraz korkunç ama:

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

Not bu mümkün iken bu - bu sadece içeride bırakılmalıdır bir ad alanı kirletici olacak şekilde gerçekten yapıyor istemediğiniz bir şey dict'un kendisi ...

+5

Ne zarif ne de iyi bir fikir söylerdim. – Marcin

+0

@Marcin Katılıyorum ... biraz daha açık yapmak için bir not ekleyeceğiz ... –

1

Eh, isimleri önceden biliyorsan, sadece önerdiğin gibi yapabilirsin.

Onları önceden tanımadıysanız, o zaman dict'i kullanmaya devam edersiniz.

Eğer ısrar ederse, alternatif olacaktır:

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

Bundan sonra tuşlar varobj üzerinde değişkenler olacaktır.

+1

Oh mystery downvoter, Eminim bunun nesi yanlış olduğunu söyleyemezsiniz. – Marcin

+1

Sorunun kapsamı, "ısrar ederseniz" gibi yorum istemez ve istemez.“OP'nin risklerin farkında olduğunu (ya da risklerin bir tartışmanın yorum alanında soruya cevap verebileceğini, bir cevap olarak düşünemeyeceğini) sanırım güvenli. bazı özel isimlerle yerel değişkenler yapma hedefini gerçekleştirin.Yalnın tonunu değiştirmeye istekli iseniz, en iyi uygulamalarla ilgili önerileri hiçbir şekilde karşılamıyorsa, oylamayı bir kez değiştirmekten memnuniyet duyarım. – ely

+1

@EMS Üzgünüm, ama OP'ye ne yapmak istediğini söylemek zorunda olmadığına dair bir kural yok, bu iyi bir fikir olup olmadığını değerlendirmeden ... Açıkçası, tutumunuz o kadar saldırgan ki, Oy vermeliyim – Marcin

İlgili konular