2014-07-08 10 views
5

मैं निम्नलिखित को लागू करने की कोशिश कर रहा हूँ:अजगर के साथ add_mutually_exclusive_group को add_argument_group के लिए कैसे argparse

$ prog.py -h 
usage: prog.py [-h] [-s | -m] [[-y [year]] | [[-1 | -3] [month] [year]]] 

हालांकि, कोई फर्क नहीं पड़ता कि कैसे मैं, add_argument_group और add_mutually_exclusive_group के साथ खेला

#!/usr/bin/env python 

import argparse 

def main(opt): 
    print(opt) 

if __name__ == '__main__': 

    parser = argparse.ArgumentParser() 
    bar = parser.add_mutually_exclusive_group() 
    bar.add_argument('-s', action='store_true', default=True) 
    bar.add_argument('-m', action='store_true', default=False) 

    #bar = parser.add_argument_group() 
    bar = parser.add_mutually_exclusive_group() 
    bar.add_argument('-y', metavar='year', type=int, 
        dest='iy', nargs='?', default=0) 
    baz = bar.add_argument_group() 
    g_13 = baz.add_mutually_exclusive_group() 
    g_13.add_argument('-1', dest='i1', 
         help='Display single month output.', 
         action='store_true', default=True) 
    g_13.add_argument('-3', dest='i3', 
         help='Display prev/current/next month output.', 
         action='store_true', default=False) 
    #aaa = bar.add_argument_group() 
    baz.add_argument(metavar='month', type=int, 
         choices=range(1, 13), 
         dest='mo', nargs='?', default=1) 
    baz.add_argument(metavar='year', type=int, 
         dest='yr', nargs='?', default=2000) 

    main(parser.parse_args()) 

मैं केवल प्रबंधन कर सकते हैं:

$ prog.py -h 
usage: prog.py [-h] [-s | -m] [-y [year]] [-1 | -3] [month] [year] 

यही है, मैंसमूह नहीं कर सकता एक पारस्परिक रूप से अनन्य समूह में 210 और [[-1 | -3] [month] [year]]। मैं समझ नहीं सकता क्यों। क्या कोई मदद कर सकता है? धन्यवाद।

+0

http://stackoverflow.com/questions/17909294/python-argparse-mutual-exclusive-group – ronakg

उत्तर

4

तर्क समूह केवल सहायता प्रदर्शन को व्यवस्थित करने में सहायता करते हैं। वे घोंसला नहीं जा सकते हैं। परस्पर अनन्य समूह परीक्षण का परीक्षण करते हैं और उपयोग प्रदर्शन को संशोधित करते हैं। उन्हें घोंसला जा सकता है, लेकिन अंतिम परिणाम वही है जैसे आपने एक बड़ा समूह बनाया है। http://bugs.python.org/issue11588 एक और सामान्य उद्देश्य usage समूह बनाने की कोशिश कर रहा है।

इस बीच आप कस्टम उपयोग लाइन लिख सकते हैं, और पार्सिंग के बाद तर्कों का परीक्षण कर सकते हैं, यदि परस्पर अनन्य समूह आपको पर्याप्त नियंत्रण नहीं देते हैं।


यहाँ एक पार्सर का उपयोग कर कोड है कि मैं के लिए http://bugs.python.org/issue11588

parser = argparse.ArgumentParser(formatter_class=argparse.UsageGroupHelpFormatter) 

bar = parser.add_usage_group(kind='mxg', dest='s|m') 
bar.add_argument('-s', action='store_true', default=True) 
bar.add_argument('-m', action='store_true', default=False) 

bar = parser.add_usage_group(kind='mxg', dest='year|more') 
bar.add_argument('-y', metavar='year', type=int,...) 

baz = bar.add_usage_group(kind='any', dest='', joiner=' ', parens='[]') 

g_13 = baz.add_usage_group(kind='mxg', dest='1|3') 
g_13.add_argument('-1', dest='i1',...) 
g_13.add_argument('-3', dest='i3',...) 

baz.add_argument(metavar='month', type=int,...) 
baz.add_argument(metavar='year', type=int,...) 

यह usage_group जो नेस्ट किया जा सकता है के साथ mutually_exclusive_group की जगह विकासशील हूँ, और 'XOR' के अलावा अन्य तार्किक संबंधों के लिए परीक्षण कर सकते हैं। 'किसी भी' प्रकार ने अपने तर्कों के किसी भी संयोजन को स्वीकार किया है, जैसा कि आपने 'तर्क_ग्रुप' को कार्य करने की अपेक्षा की थी।

परिणामी उपयोग है:

usage: prog.py [-h] [-s | -m] [-y [year] | [[-1 | -3] month year]] [month] 
      [year] 

मुख्य गलती positionals, 'माह' और 'साल' का प्रदर्शन है। वे 'किसी भी' समूह में सही जगह पर हैं, लेकिन वे स्थिति के लिए सामान्य पिछला स्थान में भी प्रदर्शित होते हैं।

ऐसा लगता है कि आदानों स्वीकार करता है:

'' 
'-y 1943 -s 
'-1 12 1943' 
'12 1943' 
'12' 
'-3' 

'1943' gives an error, because it it is out of range for a month 

आप के विस्तार के समूहों की अवधारणा तुच्छ नहीं है देख सकते हैं। मुझे लगता है कि मैं सही रास्ते पर हूं, लेकिन अभी भी मोटे किनारे हैं।

+0

का संभावित डुप्लिकेट मैंने सोचा था कि add_mutually_exclusive_group add_argument_group का एक विशेष मामला है। आपका add_usage_group add_argument_group का विकल्प प्रतीत होता है? –

+0

मेग्रुप ArgumentGroup का उप-वर्ग है, लेकिन 2 वर्गों के बीच ओवरलैप न्यूनतम है। उनका उपयोग इतना अलग है कि वे माता-पिता '_ActionsContainer' के अलग-अलग उप-वर्ग भी हो सकते हैं (जो' ArgumentParser' के लिए भी सुपर है)। मेरा 'उपयोग समूह' 'मेग्रुप' विचार का एक सामान्यीकरण है। – hpaulj

+0

स्पष्टीकरण के लिए धन्यवाद। मैं मानता हूं कि एमईग्रुप और ArgumentGroup _ActionContainer के अलग उप-वर्ग होना चाहिए। शायद पाइथन 3.5 में Argparse की अगली रिलीज आपके कार्यान्वयन को शामिल करेगी। बहुत बढ़िया! –

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