2014-07-17 29 views
7

Aşağıdaki kodu iki farklı yolla yazdım. Bunu yapmanın "doğru pythonic" yolunu bulmaya çalışıyorum. Her ikisinin de sebeplerini açıklayacağım.Sözlük değerini düzeltmek için doğru yol python

İlk yol, EAFP. Bu pythons EAFP priciple kullanır, ancak bazı kod çoğaltma neden olur.

try: 
    my_dict['foo']['bar'] = some_var 
except KeyError: 
    my_dict['foo'] = {} 
    my_dict['foo']['bar'] = some_var 

İkinci yol, LBYL. LBYL tam olarak pythonic olarak kabul edilmez, ancak kod çoğaltmasını kaldırır.

if 'foo' not in my_dict: 
    my_dict['foo'] = {} 

my_dict['foo']['bar'] = some_var 

Hangi yol en iyi olarak değerlendirilir? Yoksa daha iyi bir yolu var mı?

+0

Ben ikinci yolu kullanırsınız olmadan Sonsuz derinlikte sözlükleri için izin veren bir özyinelemeli defaultdict desen, tanıtacağım. Tekrarlanan kodlar hoş değil. Eğer 'bar' foo olursa, bir kere değiştirmelisiniz. – cdonts

cevap

8

Ben tecrübeli Python geliştiricisi kullanmak istiyorsunuz ya söyleyebilirim

dict.setdefault veya collections.defaultdict

my_dict.setdefault('foo', {})['bar'] = some_var 

veya

from collection import defaultdict 
my_dict = defaultdict(dict) 
my_dict['foo']['bar'] = some_var 

Ayrıca bütünlük uğruna, ben herhangi bir tuşa hata

>>> from collections import defaultdict 
>>> def tree(): return defaultdict(tree) 

>>> my_dict = tree() 
>>> my_dict['foo']['bar']['spam']['egg'] = 0 
>>> my_dict 
defaultdict(<function tree at 0x026FFDB0>, {'foo': defaultdict(<function tree at 0x026FFDB0>, {'bar': defaultdict(<function tree at 0x026FFDB0>, {'spam': defaultdict(<function tree at 0x026FFDB0>, {'egg': 0})})})}) 
+0

'a göre daha uygundur. Bana her iki çözümü de sunarak, davamda en iyi nasıl çalıştığını seçebilirim. (Bu durumda, sözlük bana verildiği için varsayılan ifadeyi kullanamıyorum) –

0

İkinci yol daha pythonic çünkü birisinin meydana gelebileceğini ve kolayca önlenebileceği bir hata atmıyor.

+0

İlk de "bir hata atma" değil. –

+0

Bu, istisna bloğu tarafından işlenen bir istisna atar. – Michael

+0

Katılmıyorum, try-except genellikle pep8 –

2

iyi çözüm:

my_dict.setdefault('foo', {})['bar'] = some_var 

piton sözlük almak ve setDefault yöntemlerini ararken deneyin.

3

bir defaultdict

#!/usr/bin/env python               

from collections import defaultdict            

my_dict = defaultdict(dict)              

my_dict['foo']['bar'] = "Hello, defaultdict"          

print my_dict['foo']['bar'] 
kullanın