2012-06-11 11 views
5

Bu kodu vardır:Python başlatma

def __init__(self, a, b, c, d...): 
    self.a = a 
    self.b = b 
    etc 

Ben ile değiştirilmesi düşünüyorum:

def __init__(self, a, b, c, d...): 
    args=locals() 
    for key in args: 
    self.__dict__[key] = args[key] 

bu kötü bir fikir mi? Bunu yapmak için daha iyi yollar var mı?

+1

kendini argümanı konusunda dikkatli olmasını istiyorum, ama aksi girişlerin sayısı değişecek – lxop

+0

Tamam görünüyor, ya bir dizi numara var olabilir mi? – HodofHod

+0

Teşekkürler Ixop, Girdi sayısı değişmeyecek. –

cevap

2

Bina yaklaşık **kwargs: 20 argüman olarak alıyor ise, yerine pozisyonun anahtar kelime aracılığıyla argümanları göndermek için kullanıcıların gerektirecek şekilde daha mantıklı olabilir

: 20 argümanlar ile iyi olduğunu Kodunuzu kullanan birinin argümanları yanlış sırada alabilme şansı.

Yalnızca önceden tanımlı bir anahtar listesi alırken, korsanları kabul etmeyi ve bunları almazsanız bir ValueError'u yükseltmeyi kabul ettiğinizde, 'u düşünün. Yani **kwargs'u kullanabilir ve sonra her şeyin orada olduğunu kontrol edebilirsiniz. Örneğin.

INITIAL_ARGS = set(['a','b','c','d','e'...]) 

def __init__(self, **kwargs): 
    if not INITIAL_ARGS.issubset(set(kwargs.iterkeys())): 
     raise ValueError("Class <myclass> requires 20 keyword arguments" 
          "only given %d" % len(kwargs)) 
    self.__dict__.update(kwargs) 

bu daha fazla veya orijinal daha Pythonic az olup olmadığından emin, ancak zaman bir ton tasarruf olur gibi daha sonra kodu kullanarak birisi garip hatalar alıyorsanız olası nedenini anlamaya çalışırken üzerinde görünüyor değil.

+0

OP her çağrıda aynı sayıda yayın beklerse (bir yorumda söylendi), '' 'issubset' yerine' == 'ile giderdim - kullanıcının diğer rasgele anahtar kelime argümanlarını eklemesini istemiyorum. hiçbir şey yapma ama isim alanını kirletme! – weronika

9

Zen of Python'dan: Basit, karmaşık olandan daha iyidir. ve Okunabilirlik sayımları.

Açık atamalar, değerleri ayarlamak için sihir kullanmaktan çok daha okunabilir ve daha basittir.

+1

+1 göze çarpmaya gerek yok – Levon

+0

Mesele şu an yaklaşık 20 tane değişken var; açık görev hala daha iyi mi? ve açık bir şekilde atama, "self.a = a", vs? –

+2

20 değişken kabul eden bir yöntem kötü geliyor. '** kwargs'ı kabul etmeyi ve 'self .__ dict __. Update (kwargs)' yapmayı düşündünüz mü? – ThiefMaster

1

Akıllı tasarıma göre okunabilirliği her zaman göz önünde bulundurun. Değiştirme kodunun okunması daha kolay mı? Muhtemelen bırakırım. Unutmayın ki bu basit karmaşıktır. ThiefMaster'ın dediği gibi, açık atamalar daha okunabilir. @ ThiefMaster yorumuyla ilgili

0

Python3 kullanıcıları için başka bir alternatif: 'dan init dekoratör.

@init 
def __init__(self, a, b, c, d, e, f, g, h): 
    # nothing to write here!