2009-04-11 15 views
15

मैं कुछ SQLAlchemy ORM कक्षाओं में इस तरह __init__() का उपयोग कर रहा हूं जिसमें कई पैरामीटर हैं (20 तक)।kwargs, पायथनिक या नहीं के साथ setattr?

def __init__(self, **kwargs): 
    for k, v in kwargs.iteritems(): 
     setattr(self, k, v) 

क्या यह इस तरह के गुण सेट करने के लिए "पायथनिक" है?

उत्तर

19

हां। ऐसा करने का एक और तरीका है।

def __init__(self, **kwargs): 
    self.__dict__.update(kwargs) 
+5

यह प्रश्न में संस्करण से छोटा है लेकिन ध्यान रखें कि यह गुणों (या अन्य वर्णनकर्ता) गुणों के लिए काम नहीं करेगा। –

+0

मुझे ऐसा करने की सलाह नहीं है। कभी-कभी कुछ त्रुटि मिलती है। जब '__dict__' बिल्टिन विशेषता अद्यतन करें। –

1

मेरे लिए यह बहुत ही पाइथनिक लगता है यदि आपको केवल अपने कोड में एक ही स्थान पर इसकी आवश्यकता है।

नीचे दिए गए लिंक, एक ही समस्या है (जैसे एक डेकोरेटर और कुछ अतिरिक्त कार्यक्षमता के साथ) के लिए एक अधिक 'सामान्य' दृष्टिकोण प्रदान करता है पर एक नजर है: http://code.activestate.com/recipes/551763/

4

हां, अगर तर्कों की आपूर्ति करने का कोई "अच्छा" तरीका नहीं है।

उदाहरण के लिए, अपने ORM वर्गों का उपयोग करना आप का उल्लेख है, शायद इसे और अधिक Python'y अनुमति देने के लिए किया जाएगा ..

col = Varchar() 
col.index = True 
col.length = 255 

से .. ..rather

col = Varchar(index = True, length = 255) 

ठीक है कि नहीं है सबसे अच्छा उदाहरण, क्योंकि **kwargs विधि वास्तव में अच्छा होगा .. लेकिन मेरा मुद्दा यह है कि आपको कभी-कभी **kwargs जैसे कभी-हतोत्साहित चीजों का उपयोग करने से पहले कुछ हासिल करने के वैकल्पिक तरीकों पर विचार करना चाहिए ..

ध्यान में रखने की एक और बात आप इस तरह के उपयोगकर्ता गलत कीवर्ड आर्ग है, जो चारों ओर की तरह काम किया जा सकता है की आपूर्ति करता है, तो एक लेखन त्रुटि को ऊपर उठाने के रूप में व्यवहार एक उपयोगकर्ता की उम्मीद है, खो सकता है ..

def __init__(self, **kwargs): 
    valid_kwargs = ['x', 'y', 'z'] 
    for k, v in kwargs.iteritems(): 
     if k not in valid_kwargs: 
      raise TypeError("Invalid keyword argument %s" % k) 
     setattr(self, k, v) 

को एक अंतिम बात विचार करें:

class Hmm: 
    def __init__(self, **kwargs): 
     for k, v in kwargs.iteritems(): 
      setattr(self, k, v) 
    def mymethod(self): 
     print "mymethod should print this message.." 

x = Hmm(mymethod = None) 
x.mymethod() # raises TypeError: 'NoneType' object is not callable 
+0

क्या आप उस समस्या को पकड़ना संभव है जिसे आपने कक्षा 'हम्म' में दिखाया था? उदाहरण के लिए, '__init__' जांच सकता है कि कोई विशेषता पहले से मौजूद है या नहीं, और यदि ऐसा है, तो' setattr' निष्पादित करने के बजाय अपवाद उठाएं? – max

+0

@ मैक्स हाँ, सरल तरीका होगा 'अगर हैट्टर (स्वयं, के): ...' और एक त्रुटि फेंक दें – dbr

संबंधित मुद्दे