इस सवाल के पहले से ही कई उच्च उत्कीर्ण उत्तर और एक स्वीकृत उत्तर था, लेकिन उनमें से सभी अब तक बूलियन समस्या को व्यक्त करने के विभिन्न तरीकों से विचलित थे और एक महत्वपूर्ण बिंदु से चूक गए थे:
मेरे पास एक पायथन स्क्रिप्ट है जो शून्य या तीन कमांड लाइन तर्क प्राप्त कर सकती है। (या तो यह डिफ़ॉल्ट व्यवहार पर चलता है या निर्दिष्ट तीनों मानों की आवश्यकता है)
यह तर्क पहली जगह में आपके कोड की जिम्मेदारी नहीं होनी चाहिए , बल्कि इसेargparse
मॉड्यूलद्वारा नियंत्रित किया जाना चाहिए। यदि कथन को एक जटिल लिखने में परेशान न करें, इसके बजाय अपने तर्क पार्सर को कुछ इस तरह सेट करना पसंद करें:
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser()
parser.add_argument('--foo', nargs=3, default=['x', 'y', 'z'])
args = parser.parse_args()
print(args.foo)
और हाँ, यह एक विकल्प होना चाहिए न कि एक तर्कपूर्ण तर्क, क्योंकि यह सभी वैकल्पिक के बाद है ।
संपादित: टिप्पणियों में लार्स की चिंता का समाधान करने के लिए, नीचे एक उदाहरण है कि आप इसे कैसे लिख सकते हैं यदि आप निश्चित थे कि आप इंटरफ़ेस को 3 या 0 स्थितीय आर्गन्स केसाथ चाहते थे। मेरा विचार है कि पिछला इंटरफ़ेस बेहतर शैली है, क्योंकि वैकल्पिक तर्क विकल्प होने चाहिए, लेकिन यहां पूर्णता के लिए एक वैकल्पिक दृष्टिकोण है। usage
अपने पार्सर का निर्माण करते समयओवरराइडिंग कंवर पर ध्यान दें, क्योंकिargparse
अन्यथा एक भ्रामक उपयोग संदेश उत्पन्न होगा!
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser(usage='%(prog)s [-h] [a b c]\n')
parser.add_argument('abc', nargs='*', help='specify 3 or 0 items', default=['x', 'y', 'z'])
args = parser.parse_args()
if len(args.abc) != 3:
parser.error('expected 3 arguments')
print(args.abc)
यहाँ कुछ उपयोग उदाहरण हैं:
# default case
wim@wim-zenbook:/tmp$ ./three_or_none.py
['x', 'y', 'z']
# explicit case
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2 3
['1', '2', '3']
# example failure mode
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2
usage: three_or_none.py [-h] [a b c]
three_or_none.py: error: expected 3 arguments