2014-04-17 4 views
5

मेरे पास पाइथन स्क्रिप्ट का एक गुच्छा है जो इनपुट पढ़ने और विभिन्न प्रकार की आउटपुट फ़ाइलों को लिखने के लिए सामान्य कोड का उपयोग करता है।ArgParse पायथन मॉड्यूल: विरासत तर्क के लिए डिफ़ॉल्ट तर्क मान बदलें

ये रासायनिक संरचना फाइलें हैं। कुछ उदाहरण फ़ाइल प्रकार .smi या .sdf होंगे।

डिफ़ॉल्ट रूप से, मैं इनमें से कुछ स्क्रिप्ट को "एसएमआई" फ़ाइल प्रारूप में डेटा आउटपुट करना चाहता हूं, और अन्य "एसडीएफ" प्रारूप में डेटा आउटपुट करने के लिए चाहते हैं।

क्या माता-पिता पार्सर से प्राप्त एक तर्क के डिफ़ॉल्ट मान को ओवरराइड करना संभव है?

उदाहरण के लिए ...

# Inherited code 
filesParser = argparse.ArgumentParser(add_help=False) 
filesParser.add_argument('-o', dest='outformat', default="smi") 

# Script code 
parser = argparse.ArgumentParser(description='inherts from filesParser', parents=[filesParser]) 
parser.add_argument('--foo') 

# Something like... 
# parser.outformat.default = "sdf" 

args = parser.parse_args() 

पहली पोस्ट इसलिए आशा है कि मेरी शिष्टाचार ठीक है।

बहुत धन्यवाद, डेव

उत्तर

5

हां (docs):

>>> parser.parse_args([]) 
Namespace(foo=None, outformat='smi') 
>>> parser.set_defaults(outformat='sdf') 
>>> parser.parse_args([]) 
Namespace(foo=None, outformat='sdf') 
+0

बहुत धन्यवाद! मैं थोड़ी देर के लिए चारों ओर देख रहा था और इसे नहीं देखा। – user3544841

2

set_defaults शायद सबसे आसान ठीक है।

लेकिन मुझे लगता है, जबकि जानते हुए भी कि आप एक कार्रवाई के डिफ़ॉल्ट सीधे

filesParser = argparse.ArgumentParser(add_help=False) 
outaction=filesParser.add_argument('-o', dest='outformat', default="smi") 
parser = argparse.ArgumentParser(description='inherts from filesParser', parents=[filesParser]) 
fooaction=parser.add_argument('--foo') 
print fooaction.default 
# None 
print outaction.default 
# 'smi' 
outaction.default='sdf' 
args=parser.parse_args() 
print args 
# Namespace(foo=None, outformat='sdf') 

add_argument रिटर्न एक Action वस्तु को बदल सकते हैं, जो सभी जानकारी है कि आप तर्क में निर्दिष्ट होता है इसके लायक है। यहां मैं वेरिएबल्स outaction और fooaction में उन क्रियाओं को सहेजता हूं (लिंक)। outaction.default डिफ़ॉल्ट मान है जो parse_args उपयोग करता है।

आपके विरासत कोड के साथ यह शायद outaction लिंक को सहेजने के लिए अजीब है (हालांकि इसे 'parser._actions' सूची में ढूंढना संभव है)। इसलिए set_defaults आपके लिए नौकरी देने का अर्थ है।

set_defaults के लिए कोड शिक्षाप्रद हो सकता है:

def set_defaults(self, **kwargs): 
    self._defaults.update(kwargs) 

    # if these defaults match any existing arguments, replace 
    # the previous default on the object with the new one 
    for action in self._actions: 
     if action.dest in kwargs: 
      action.default = kwargs[action.dest] 

पहले यह parser._defaults शब्दकोश में नए चूक डालता है, और फिर इसे सशर्त action.default विशेषता (parser._actions की खोज पर ध्यान दें) संशोधित करता है। इसे दोनों करना है, क्योंकि जब डिफ़ॉल्ट का उपयोग करने का समय आता है, तो action.default मान parser._defaults मान पर प्राथमिकता है।

यदि आप इस कोड को एक इंटरैक्टिव शैल (जैसे Ipython) में चलाते हैं तो यह विवरण अधिक समझदार होगा और action और parser ऑब्जेक्ट्स प्रिंट कर सकते हैं। 'निजी' विशेषताओं के साथ खेलने के बारे में सामान्य सावधानी लागू होती है।

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