2013-05-27 6 views
7

मैं विभिन्न समूहों के बीच एक पारस्परिक रूप से अनन्य समूह रखने की कोशिश कर रहा हूं: मेरे पास तर्क हैं- ए, -बी, -सी, और मैं एक साथ और एक साथ संघर्ष करना चाहता हूं , या-ए और -सी एक साथ। सहायता कुछ दिखाना चाहिए [-a | ([-बी] [-सी])]।समूहों के बीच परस्पर अनन्य का उपयोग

import argparse 
parser = argparse.ArgumentParser(description='My desc') 
main_group = parser.add_mutually_exclusive_group() 
mysub_group = main_group.add_argument_group() 
main_group.add_argument("-a", dest='a', action='store_true', default=False, help='a help') 
mysub_group.add_argument("-b", dest='b', action='store_true',default=False,help='b help') 
mysub_group.add_argument("-c", dest='c', action='store_true',default=False,help='c help') 
parser.parse_args() 

विभिन्न संयोजनों पार्स - सभी पास::

निम्नलिखित कोड परस्पर अनन्य विकल्प हैं करने के लिए प्रतीत नहीं होता

> python myscript.py -h 
usage: myscript.py [-h] [-a] [-b] [-c] 

My desc 

optional arguments: 
    -h, --help show this help message and exit 
    -a   a help 
> python myscript.py -a -c 
> python myscript.py -a -b 
> python myscript.py -b -c 

मैं mysub_group बदलते add_mutually_exclusive_group होना करने की कोशिश की पारस्परिक रूप में सब कुछ बदल जाता है अनन्य:

> python myscript.py -h 
usage: myscript.py [-h] [-a | -b | -c] 

My desc 

optional arguments: 
    -h, --help show this help message and exit 
    -a   a help 
    -b   b help 
    -c   c help 

मैं [-a | के लिए तर्क कैसे जोड़ सकता हूं ([-बी] [-सी])]?

उत्तर

1

तो, यह कई बार पूछा गया है। सरल जवाब "Argparse के साथ है, आप नहीं कर सकते"। हालांकि, यह सरल जवाब है। एक

$ python parser b -h 
usage: parser b [-h] [-c] 

optional arguments: 
    -h, --help show this help message and exit 
    -c   c help 

आप अपने तर्कों के रूप सवाल में कहा गया है चाहते हैं, तो हैं: आप subparsers का उपयोग कर सकता है, तो:

import argparse 
parser = argparse.ArgumentParser(description='My desc') 
sub_parsers = parser.add_subparsers() 
parser_a = sub_parsers.add_parser("a", help='a help') 
parser_b = sub_parsers.add_parser("b", help='b help') 
parser_b.add_argument("-c", dest='c', action='store_true',default=False,help='c help') 
parser.parse_args() 

फिर आप मिल:

$ python parser -h 
usage: parser [-h] {a,b} ... 

My desc 

positional arguments: 
    {a,b} 
    a   a help 
    b   b help 

optional arguments: 
    -h, --help show this help message and exit 

और docopt पर देखो, यह सुंदर दिखता है, और आपको वही करना चाहिए जो आप चाहते हैं।

+0

कोई भी चीज़ जो मैं चाहता हूं, क्योंकि यह मुझे केवल -c (बिना -b के) के विकल्प का विकल्प नहीं देता है। – itzhaki

+0

यह सच है, मेरी माफ़ी। मुझे नहीं लगता कि आप तर्क के साथ जो भी चाहते हैं उसे प्राप्त कर सकते हैं, लेकिन मुझे अभी भी लगता है कि डॉकॉप एक अच्छी पसंद है, आप बस उपयोग जोड़ देंगे: myscript.py [-h | -ए | [-बी-सी]] आपके डॉकस्ट्रिंग में और यह आपके लिए सब कुछ काम करेगा –

0

argument_groups पार्सिंग को प्रभावित नहीं करते हैं। वे सिर्फ मदद स्वरूपण में योगदान करते हैं। तो mutually_exclusive_group के भीतर एक समूह को परिभाषित करने से इस समस्या में मदद नहीं मिलती है।

वहाँ एक प्रस्तावित पैच, http://bugs.python.org/issue10984, 'argparse add_mutually_exclusive_group should accept existing arguments to register conflicts', कि तुम दो mutually_exclusive_groups, एक [-a | -b] और अन्य [-a | -c] को परिभाषित करने की अनुमति होगी है। एक दूसरा समूह बनाना जिसमें एक तर्क (-a) शामिल है जो पहले से परिभाषित है, इस पैच का छोटा हिस्सा है। एक सार्थक उपयोग लाइन का निर्माण करना अधिक कठिन है, और कई HelpFormatter विधियों के पुनर्लेखन की आवश्यकता है।

import argparse 
parser = argparse.ArgumentParser(description='My desc') 
group1 = parser.add_mutually_exclusive_group() 
action_a = group1.add_argument("-a", dest='a', action='store_true', default=False, help='a help') 
group1.add_argument("-b", dest='b', action='store_true',default=False,help='b help') 

group2 = parser.add_mutually_exclusive_group() 
group2.add_argument("-c", dest='c', action='store_true',default=False,help='c help') 
group2._group_actions.append(action_a) # THE KLUDGE 

print parser.format_usage() 
# usage: stack16769409.py [-h] [-a | -b] [-c] 

args = parser.parse_args() 

Usage 2 समूहों को सही ढंग से नहीं दिखाता है। लेकिन यह -b -c स्वीकार करता है, जबकि -a -b और -a -c पर ऑब्जेक्ट करते समय। लेकिन आप एक कस्टम उपयोग लाइन लिख सकते हैं।

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