यदि अनिर्दिष्ट हो तो अर्गपर्स स्टोर गलत है


104
parser.add_argument('-auto', action='store_true')

यदि -autoमैं अनिर्दिष्ट है तो मैं झूठा कैसे स्टोर कर सकता हूं ? मैं बेहोश हो सकता है कि इस तरह से याद है, यह अनिर्दिष्ट अगर कोई नहीं संग्रहीत करता है

जवाबों:


171

store_trueविकल्प स्वचालित रूप से डिफ़ॉल्ट मान बनाता है झूठी

इसी तरह, कमांड-लाइन तर्क मौजूद नहीं होने store_falseपर True पर डिफ़ॉल्ट हो जाएगा ।

इस व्यवहार का स्रोत संक्षिप्त और स्पष्ट है: http://hg.python.org/cpython/file/2.7/Lib/argparse.py#l861

अर्गपर्स डॉक्स विषय पर स्पष्ट नहीं हैं, इसलिए मैं उन्हें अभी अपडेट करूंगा: http://hg.python.org/cpython/rev/49677cc6d83a


2
इस बारे में टिप्पणियों की एक जोड़ी। पहले, ऐसा लगता है कि यदि विकल्प है -bar, तो hg.python.org/cpython/rev/49677cc6d83a के आधार पर destस्वचालित रूप से सेट हो जाता है । हालाँकि, मैं यह नहीं देखता कि यह डिफ़ॉल्ट व्यवहार कोड में कहाँ सेट है। मैंने हमेशा तर्क स्पष्ट रूप से निर्धारित किया है। इसके अलावा, मुझे लगता है कि विकल्प के लिए डिफ़ॉल्ट देना वास्तव में कोई मतलब नहीं है अगर है । नहीं करना चाहिए हो इस मामले में? bardestbardest--bar--barstore_falsedestnotbar
फहीम मीठा

4
मुझे विरोधाभासी नामकरण सम्मेलन समझ में नहीं आया।
ब्रेन लूप

मैं सहमत हूं, यह थोड़ा भ्रमित करने वाला है। वैसे भी, 'store_false' या 'store_true' को कार्रवाई के रूप में निर्दिष्ट किया गया है, न कि एक डिफ़ॉल्ट मान के रूप में। इस प्रकार, जब आप इस तर्क को प्रोग्राम में जोड़ते हैं, तो निर्दिष्ट कार्रवाई शुरू हो जाती है।
ady

15

साथ में

import argparse
parser=argparse.ArgumentParser()
parser.add_argument('-auto', action='store_true', )
args=parser.parse_args()
print(args)

चल रहा है

% test.py

पैदावार

Namespace(auto=False)

तो यह Falseडिफ़ॉल्ट रूप से भंडारण के लिए प्रतीत होता है ।


3

रेमंड हेटिंगर ने ओपी के सवाल का पहले ही जवाब दे दिया।

हालाँकि, मेरे समूह ने "store_false" का उपयोग करके पठनीयता के मुद्दों का अनुभव किया है। खासकर जब नए सदस्य हमारे समूह में शामिल होते हैं। ऐसा इसलिए है क्योंकि यह सोचने का सबसे सहज तरीका है कि जब कोई उपयोगकर्ता किसी तर्क को निर्दिष्ट करता है, तो उस तर्क के अनुरूप मूल्य सही या 1 होगा।

उदाहरण के लिए, यदि कोड है -

parser.add_argument('--stop_logging', action='store_false')

कोड रीडर संभवतः लॉगिंग स्टेटमेंट बंद होने की उम्मीद कर सकता है जब stop_log में मान सत्य है। लेकिन निम्नलिखित जैसे कोड वांछित व्यवहार के विपरीत को जन्म देंगे -

if not stop_logging:
    #log

दूसरी ओर, यदि इंटरफ़ेस को निम्नलिखित के रूप में परिभाषित किया गया है, तो "if-statement" काम करता है और पढ़ने के लिए अधिक सहज है -

parser.add_argument('--stop_logging', action='store_true')
if not stop_logging:
    #log

7
आप एक गंतव्य उपनाम सेट कर सकते हैं, जो पठनीयता में सुधार करेगा parser.add_argument('--stop_logging', action='store_false', dest='use_logging'):।
कृ ०

-4

store_false वास्तव में डिफ़ॉल्ट रूप से 0डिफ़ॉल्ट होगा (आप सत्यापित करने के लिए परीक्षण कर सकते हैं)। यह क्या चूक करता है इसे बदलने के लिए, बस default=Trueअपनी घोषणा में जोड़ें ।

तो इस मामले में: parser.add_argument('-auto', action='store_true', default=True)


यह पायथन 2.7 और 3.4 में मामला प्रतीत नहीं होता है: >>> parser.add_argument('--bar', action='store_false') _StoreFalseAction(option_strings=['--bar'], dest='bar', nargs=0, const=False, default=True, type=None, choices=None, help=None, metavar=None) >>> parser.parse_args([]) Namespace(bar=True)
लेयोनोस

2
क्षमा करें, यह वास्तव में ऑप्टपर्स का डिफ़ॉल्ट व्यवहार है। argparse को स्टोर के व्युत्क्रम में डिफ़ॉल्ट होना चाहिए। यानी, 'store_false' डिफॉल्ट को 'True' करता है।
यूनिक्स-निंजा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.