2016-08-10 11 views
5

मैं कुछ आदेश पंक्ति तर्क समूहों में वर्गीकृत के रूप में निम्नानुसार है:पायथन Argparse: मैं अलग-अलग तर्क समूहों के लिए नेमस्पेस ऑब्जेक्ट्स कैसे प्राप्त कर सकता हूं?

cmdParser = argparse.ArgumentParser() 
cmdParser.add_argument('mainArg') 

groupOne = cmdParser.add_argument_group('group one') 
groupOne.add_argument('-optA') 
groupOne.add_argument('-optB') 

groupTwo = cmdParser.add_argument_group('group two') 
groupTwo.add_argument('-optC') 
groupTwo.add_argument('-optD') 

मैं ऊपर कैसे पार्स कर सकते हैं, जैसे कि मैं तीन अलग-अलग नाम स्थान वस्तुओं के साथ अंत?

global_args - containing all the arguments not part of any group 
groupOne_args - containing all the arguments in groupOne 
groupTwo_args - containing all the arguments in groupTwo 

धन्यवाद!

+0

मैं argparse लगता है कि सुविधा है। – wim

उत्तर

1

आप इस तरह से यह कर सकते हैं:

import argparse 
parser = argparse.ArgumentParser() 

group1 = parser.add_argument_group('group1') 
group1.add_argument('--test1', help="test1") 

group2 = parser.add_argument_group('group2') 
group2.add_argument('--test2', help="test2") 

args = parser.parse_args('--test1 one --test2 two'.split()) 

arg_groups={} 

for group in parser._action_groups: 
    group_dict={a.dest:getattr(args,a.dest,None) for a in group._group_actions} 
    arg_groups[group.title]=argparse.Namespace(**group_dict)) 

यह आपको सामान्य आर्ग, प्लस शब्दकोश arg_groups जोड़ा समूहों में से प्रत्येक के लिए नामस्थान युक्त दे देंगे।

(this answer से अनुकूलित)

+0

साफ! मैंने यह जवाब स्वीकार कर लिया! – shikhanshu

2

argparse में कुछ भी ऐसा करने के लिए डिज़ाइन नहीं किया गया है।

क्या इसके लायक है के लिए, parser दो तर्क समूहों, एक है कि positionals के रूप में प्रदर्शित करता है और optionals के रूप में अन्य (मैं सटीक खिताब भूल) से शुरू होती है। तो आपके उदाहरण में वास्तव में 4 समूह होंगे।

पार्सर केवल सहायता स्वरूपण करते समय तर्क समूहों का उपयोग करता है। सभी तर्कों को पार्स करने के लिए मास्टर parser._actions सूची में रखा गया है। और पार्सर पार्सिंग के दौरान केवल एक नेमस्पेस ऑब्जेक्ट पास होता है।

आप अलग-अलग पार्सर्स को तर्क के विभिन्न सेटों के साथ परिभाषित कर सकते हैं, और parse_known_args के साथ प्रत्येक को कॉल कर सकते हैं। यह positionals के मुकाबले optionals (ध्वजांकित) तर्कों के साथ बेहतर काम करता है। और यह आपकी मदद टुकड़े करता है।

मैं अन्य अतः सवालों में एक उपन्यास Namespace वर्ग (group1.optA, group2.optC, आदि जैसे नाम) बिंदीदार dest किसी प्रकार के आधार पर घोंसला मान सकता है का पता लगाया है। मुझे याद नहीं है कि मुझे Action कक्षाओं को अनुकूलित करना है या नहीं।

बुनियादी बात यह है कि जब नाम स्थान, एक पार्सर, या वास्तव में एक Action (तर्क) वस्तु के लिए एक मूल्य की बचत करता है:

setattr(namespace, dest, value) 

कि (और getattr/hasattr) सब पार्सर उम्मीद है namespace का। डिफ़ॉल्ट Namespace वर्ग सरल है, एक सादे object सबक्लास से थोड़ा अधिक है। लेकिन यह और अधिक विस्तृत हो सकता है।

+0

विवरण स्पष्टीकरण के लिए धन्यवाद। मैंने मैनस्पेस विशेषताओं को मैन्युअल रूप से समूहीकृत कर दिया क्योंकि मुझे उनकी आवश्यकता थी। यह Argparse के लिए एक अच्छा जोड़ा होगा यदि यह उपयोगकर्ता को समूह नाम से विकल्पों को पुनर्प्राप्त करने की अनुमति दे सकता है (यानी सहायता समूह प्रदर्शित करने से अधिक के लिए 'समूह' अवधारणा का उपयोग करें) – shikhanshu

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

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