2013-03-04 8 views
19

मैं के रूप मेंkwargs के रूप में कार्य करने के लिए argparse तर्क पर कैसे पास करें?

class M(object): 
    def __init__(self, **kwargs): 
     ...do_something 

इस प्रकार एक वर्ग को परिभाषित किया है और मैं argparse.parse_args() का परिणाम है, उदाहरण के लिए:

> args = parse_args() 
> print args 
Namespace(value=5, message='test', message_type='email', extra="blah", param="whatever") 

मैं (message_type को छोड़कर) इस नाम स्थान का मान प्रदान करने के लिए चाहते हैं बनाने के लिए कक्षा M का एक उदाहरण। मैं

M(args) 

कोशिश की, लेकिन एक त्रुटि

TypeError: __init__() takes exactly 1 argument (2 given) 

जो मुझे समझ नहीं आता मिला है। मैं कैसे

  1. मूल्य message_type सूची से में args
  2. पास मूल्यों पर जैसे मैं M(value=5, message='test', extra="blah", param="whatever") सीधे टाइप करेंगे निकाल सकते हैं। एक शब्दकोश के रूप में

    M(**vars(args)) 
    

    vars() function रिटर्न नामस्थान उदाहरण के नाम स्थान (अपने __dict__ विशेषता):

उत्तर

31

आप vars(args) बजाय के परिणाम में पारित करने के लिए की जरूरत है।

M.__init__() के अंदर, बस message_type कुंजी को अनदेखा करें।

+1

मुझे वही चाहिए जो मुझे चाहिए। धन्यवाद। निश्चित कुंजी को हटाने के अलावा। मुझे इसे हटाने की जरूरत है, मैं इस सवाल के दायरे से बाहर के कारणों के लिए इसे अनदेखा नहीं कर सकता। – Alex

+2

मैं 'vars' के साथ संभव अपरिभाषित व्यवहार से बचने के लिए' arg_dict = dict ((k, v) के लिए v, v में vars (args) .items() if k! = "Message_type") करने का सुझाव देता हूं। – Alex

+0

@Alex: 'vars' के साथ क्या अपरिभाषित व्यवहार? आप 'message_type' कुंजी को इस तरह से फ़िल्टर कर सकते हैं, निश्चित रूप से, लेकिन इसके लिए स्वयं करें, क्योंकि' vars() 'में अपरिभाषित व्यवहार हो सकता है (जो यह नहीं करता है)। –

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