2012-09-06 14 views
8

मुझे एहसास है कि यह Setting default option in Python of two mutually exclusive options using the argparse module जैसा है, हालांकि एक अलग परिप्रेक्ष्य से (और दिए गए उत्तरों में सहायता नहीं होती है)।डिफ़ॉल्ट रूप से गलत सेट करें यदि कोई अन्य पारस्परिक रूप से अनन्य तर्क सत्य है

कोड ब्लॉक (पार्सर argparse.ArgumentParser का एक उदाहरण है):

mutex_group = parser.add_mutually_exclusive_group() 
mutex_group.add_argument("--show", action="store_true", 
    dest="show", default=True) 
mutex_group.add_argument("--insert", action="store_true", 
    dest="insert") 

opts = parser.parse_args() 

--show या --insert निर्दिष्ट कर रहे हैं अगर मैं --show (इसलिए default=True) के लिए डिफ़ॉल्ट करना चाहते हैं लेकिन अगर --insert प्रयोग किया जाता है तो opts.show अब भी है परस्पर अनन्य ब्लॉक का हिस्सा होने के बावजूद, सत्य (डिफ़ॉल्ट की वजह से) सेट करें।

वर्तमान कोड की जाँच करता है कि अन्य विकल्पों में से कोई भी स्थापित किए गए हैं जब परीक्षण है कि क्या यह सच है opt.show, है अर्थात्:

if opts.show and not opts.insert: 
    do_something() 
elif opts.insert: 
    do_something_else() 

लेकिन इस पैमाने पर नहीं करता है (क्या होता है जब आप परस्पर अनन्य करने के लिए --delete जोड़ने समूह, इत्यादि) इसलिए मैं हर दूसरे चर को opts.show झूठी बनाने के लिए एक बेहतर तरीका ढूंढ रहा हूं, जबकि इसे अभी भी डिफ़ॉल्ट के रूप में रखना है।

Argparse दस्तावेज़ों को पढ़ना, मुझे लगता है कि एक कस्टम कार्रवाई करने का तरीका होगा, लेकिन यह नहीं देख सकता कि परस्पर अनन्य समूह के अन्य सदस्यों को कैसे पहुंचाया जा सकता है (सिद्धांत यह है कि मैं उन पर पुनरावृत्ति कर सकता हूं, और अगर बाकी में से कोई भी सेट किया गया तो डिफ़ॉल्ट को फ़्लिप करें)। दूसरा विकल्प यदि शर्तों को उलट देता है, लेकिन यह अशुद्ध लगता है (यदि डिफ़ॉल्ट परिवर्तन होते हैं, तो अगर बयानों का क्रम भी बदलना होगा)।

उत्तर

19

यह मेरे लिए होता है कि शायद 'store_const' एक और उचित कार्रवाई होगी (उसी गंतव्य पर इंगित सभी तर्कों के साथ)।

import argparse 
parser = argparse.ArgumentParser() 
mutex_group = parser.add_mutually_exclusive_group() 
mutex_group.add_argument("--show", action="store_const", 
    dest="mutex", const="show") 
mutex_group.add_argument("--insert", action="store_const", 
    dest="mutex", const="insert") 
mutex_group.add_argument('--delete', action="store_const", 
    dest="mutex", const="delete") 


parser.set_defaults(mutex='show') 
args = parser.parse_args() 
print(args) 

अब आप args.mutex का उपयोग यह पता लगाने की जो कार्रवाई करने के लिए कर सकते हैं।