2013-08-02 12 views
13

मैं कैसे argparse सेट कर सकता हूं argparse:अजगर सशर्त आवश्यकताओं

if -2 is on the command line, no other arguments are required 
if -2 is not on the command line, -3 and -4 arguments are required 

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

-2 [good] 
-3 a -4 b [good] 
-3 a [not good, -4 required] 
-2 -5 c [good] 
-2 -3 a [good] 

इसी तरह के सवाल यहां की एक संख्या हैं, लेकिन या तो वे इस का पता नहीं स्थिति या मुझे समझ में नहीं आता है।

पायथन 2.7 यदि यह मायने रखता है।

+0

एक subparser -2 कि वैकल्पिक के रूप में अन्य आदेशों प्रतिकृति पर keyed करें। शीर्ष स्तर पर, लिंक -3 और -4 एक साथ। – Jiminion

+0

'-' से शुरू होने वाले उपपरर आदेशों का उपयोग करना मुश्किल हो सकता है। '-2' काम कर सकता है, लेकिन' -t' या '--two' ऐसा नहीं होगा क्योंकि वे विकल्प की तरह दिखते हैं। लेकिन यदि '-3' को तर्क के रूप में परिभाषित किया गया है, तो' -2' अब उपपरसर कमांड (या एक विकल्प) के रूप में काम नहीं करता है। – hpaulj

उत्तर

13

एक उपपरक्षक (टिप्पणियों में सुझाए गए अनुसार) काम कर सकता है।

एक अन्य विकल्प (के बाद से mutually_exclusive_group काफी ऐसा नहीं कर सकते) बस मैन्युअल रूप से इसे कोड करने के लिए, क्योंकि यह थे है: यह करने के लिए एक छोटे से चालक जोड़ना

import argparse 

def main(): 
    parser = argparse.ArgumentParser() 

    parser.add_argument('-2', dest='two', action='store_true') 
    parser.add_argument('-3', dest='three') 
    parser.add_argument('-4', dest='four') 
    parser.add_argument('-5', dest='five') 

    args = parser.parse_args() 

    if not args.two: 
     if args.three is None or args.four is None: 
      parser.error('without -2, *both* -3 <a> *and* -4 <b> are required') 

    print args 
    return 0 

:

import sys 
sys.exit(main()) 

और रन आपके उदाहरणों के साथ, यह सही काम करने लगता है;

$ python mxgroup.py -2; echo $? 
Namespace(five=None, four=None, three=None, two=True) 
0 
$ python mxgroup.py -3 a; echo $? 
usage: mxgroup.py [-h] [-2] [-3 THREE] [-4 FOUR] [-5 FIVE] 
mxgroup.py: error: without -2, *both* -3 <a> *and* -4 <b> are required 
2 
$ 
+0

बेहतर विकल्पों की अनुपस्थिति में, इसे मैन्युअल रूप से करने से सबसे अच्छा कोर्स – foosion

+0

लगता है http://stackoverflow.com/questions/17917265/python-argparser-for-multiple-arguments-for-partial-choices/17982009#17982009 I दो कदम पार्सिंग का सुझाव दें। '-2' ध्वज की जांच के लिए पहले 'parse_known_args' का उपयोग करें, और यदि यह गुम है, तो' -3' और '-4' देखने के लिए एक और पार्सर का उपयोग करें। – hpaulj

+0

मुझे नहीं लगता कि प्रत्येक तर्क के लिए सहायता सेट करने के अलावा --help अन्य प्रिंट करने के लिए एक तरीका है ... – Leonid

1

मुझे लगता है कि यह है कि प्राप्त करने के लिए (एक अच्छा सहायता संदेश सहित), जबकि केवल मानक argparse फ़ंक्शन का उपयोग बहुत मुश्किल है: यहाँ दो रन कर रहे हैं। तर्कों को पार करने के बाद भी आप आसानी से इसका परीक्षण कर सकते हैं। आप उपन्यास में या तो अतिरिक्त आवश्यकताओं का वर्णन कर सकते हैं। ध्यान दें कि विकल्पों के रूप में संख्याओं का उपयोग करना असामान्य है, मुझे dest = 'two' का उपयोग करना था, क्योंकि args.2 वैध वाक्यविन्यास नहीं है।

#!/usr/bin/env python 

import argparse 

parser = argparse.ArgumentParser(
    description='bla bla', 
    epilog='Note: arguments -3 and -4 are required when -2 is missing') 

parser.add_argument('-2', dest='two', action='store_true') 
parser.add_argument('-3', dest='three') 
parser.add_argument('-4', dest='four') 
parser.add_argument('-5', dest='five') 

args = parser.parse_args() 

if not args.two and (args.three is None or args.four is None): 
    parser.error('arguments -3 and -4 are required when -2 is missing') 

print 'Good:', args 
इन परिणामों के साथ

:

[~]: ./test.py -h 
usage: test.py [-h] [-2] [-3 THREE] [-4 FOUR] [-5 FIVE] 

bla bla 

optional arguments: 
    -h, --help show this help message and exit 
    -2 
    -3 THREE 
    -4 FOUR 
    -5 FIVE 

Note: arguments -3 and -4 are required when -2 is missing 

[~]: ./test.py -2 
Good: Namespace(five=None, four=None, three=None, two=True) 
[~]: ./test.py -3 a -4 b 
Good: Namespace(five=None, four='b', three='a', two=False) 
[~]: ./test.py -3 a 
usage: test.py [-h] [-2] [-3 THREE] [-4 FOUR] [-5 FIVE] 
test.py: error: arguments -3 and -4 are required when -2 is missing 
[~]: ./test.py -2 -5 c 
Good: Namespace(five='c', four=None, three=None, two=True) 
[~]: ./test.py -2 -3 a 
Good: Namespace(five=None, four=None, three='a', two=True) 
+0

जबकि 'args.2' काम नहीं करता है,' getattr (args, '2') 'करता है। '-2' जैसे तर्कों की अनुमति है, लेकिन अनावश्यक जटिलताओं को जोड़ें। – hpaulj

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