2012-06-11 14 views
5

मैं इस कोड है:अजगर प्रारंभ

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

मैं इसकी जगह के बारे में सोच रहा हूँ:

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

इस एक बुरा विचार है? क्या ऐसा करने के कोई बेहतर तरीके हैं?

+1

स्वयं तर्क के बारे में सावधान रहना चाहता हूँ सकता है, लेकिन अन्यथा ठीक लग रहा है – lxop

+0

आदानों की संख्या में परिवर्तन होगा, या वहाँ एक निर्धारित संख्या है? – HodofHod

+0

धन्यवाद Ixop, इनपुट की संख्या में बदलाव नहीं होगा। –

उत्तर

2

बिल्डिंग @ ThiefMaster की टिप्पणी पर के बारे में **kwargs:

आप 20 बहस में ले रहे हैं, यह स्थिति के बजाय कीवर्ड के माध्यम से तर्क भेजने के लिए अपने उपयोगकर्ताओं की आवश्यकता के लिए और अधिक समझ कर सकता है: 20 तर्क के साथ, वहाँ एक सभ्य है मौका है कि आपके कोड का उपयोग करने वाले किसी व्यक्ति को गलत क्रम में तर्क मिलेगा।

जबकि चाबियाँ आप स्वीकार करना चाहते हैं की एक पूर्वनिर्धारित सूची होने और यदि आप उन्हें प्राप्त नहीं होता है एक ValueError बढ़ाने पर विचार करें केवल स्वीकार करने kwargs। तो आप **kwargs का उपयोग कर सकते हैं और फिर जांच सकते हैं कि सबकुछ वहां है। जैसे

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) 

सुनिश्चित नहीं हूं कि यह अधिक या अपने मूल की तुलना में कम pythonic है, लेकिन यह है कि यह समय की बचत हो जाएगा बाद में जब क्यों अपने कोड का उपयोग किसी को अजीब त्रुटियों हो रही हो सकता है यह पता लगाने की कोशिश कर रहा पर लगता है।

+0

ओ पी (है कि एक टिप्पणी में कहा गया था) हर कॉल में आर्ग की एक ही नंबर की उम्मीद है, मैं 'के साथ जाना चाहते हैं ==' 'बल्कि issubset' से - है अन्य यादृच्छिक कीवर्ड तर्क जोड़ने के लिए उपयोगकर्ता नहीं चाहता कि नामस्थान को प्रदूषित करने के अलावा कुछ भी मत करो! – weronika

9

Zen of Python से: सरल जटिल से बेहतर है। और पठनीयता की गणना करता है।

स्पष्ट असाइनमेंट मूल्यों को सेट करने के लिए जादू का उपयोग करने से कहीं अधिक पठनीय और सरल हैं।

+1

+1 – Levon

+0

obfuscate करने की कोई आवश्यकता नहीं है यह बात लगभग 20 ऐसे चर हैं; स्पष्ट असाइनमेंट अभी भी बेहतर है? और स्पष्ट काम करके, आप मतलब है "self.a = एक", आदि? –

+2

20 चर स्वीकार करने वाली विधि खराब लगता है। है आप को स्वीकार करने '** kwargs' और कर' स्वयं .__ dict __। अद्यतन (kwargs) 'माना जाता? – ThiefMaster

1

हमेशा चालाक डिजाइन पर पठनीयता पर विचार करें। प्रतिस्थापन कोड पढ़ने के लिए आसान है? मैं शायद इसे छोड़ दूंगा। याद रखें कि जटिल जटिल से बेहतर है। चूंकि थिफ़मास्टर ने कहा, स्पष्ट असाइनमेंट अधिक पठनीय हैं।

0

पायथन 3 उपयोगकर्ताओं के लिए एक और विकल्प: initdrastic से सजावटी।

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