जवाबों:
अंत में, बीच का अंतर try, exceptऔर परीक्षण len(sys.argv)सभी महत्वपूर्ण नहीं है। वे दोनों की तुलना में थोड़ा हैकिश हैंargparse ।
यह मेरे लिए होता है, हालांकि - कम बजट के एक प्रकार के झगड़े के रूप में:
arg_names = ['command', 'x', 'y', 'operation', 'option']
args = dict(zip(arg_names, sys.argv))
आप इसका उपयोग namedtupleउन मानों को उत्पन्न करने के लिए भी कर सकते हैं, जो डिफ़ॉल्ट रूप से None- सभी चार लाइनों में!
Arg_list = collections.namedtuple('Arg_list', arg_names)
args = Arg_list(*(args.get(arg, None) for arg in arg_names))
यदि आप इससे परिचित नहीं हैं namedtuple, तो यह सिर्फ एक टपल है जो ऑब्जेक्ट की तरह काम करता है, जिससे आप tup.attributeसिंटैक्स के बजाय सिंटैक्स का उपयोग करके इसके मूल्यों को एक्सेस कर सकते हैं tup[0]।
तो पहली पंक्ति namedtupleप्रत्येक मान के लिए मानों के साथ एक नया प्रकार बनाती है arg_names। दूसरी पंक्ति argsशब्दकोश से मानों को पारित करती है , getडिफ़ॉल्ट मान वापस करने के लिए जब दिए गए तर्क नाम का शब्दकोश में संबद्ध मूल्य नहीं होता है।
की लंबाई की जाँच करें sys.argv:
if len(sys.argv) > 1:
blah = sys.argv[1]
else:
blah = 'blah'
कुछ लोग आपके द्वारा सुझाए गए अपवाद-आधारित दृष्टिकोण (जैसे try: blah = sys.argv[1]; except IndexError: blah = 'blah') को पसंद करते हैं , लेकिन मुझे यह उतना पसंद नहीं है क्योंकि यह "स्केल" लगभग नहीं है (जैसे, जब आप दो या तीन तर्क स्वीकार करना चाहते हैं) और यह संभावित रूप से त्रुटियों को छिपा सकता है (उदाहरण के लिए, यदि आप उपयोग करते हैं blah = foo(sys.argv[1]), लेकिन foo(...)उठाया IndexError, IndexErrorतो इसे नजरअंदाज कर दिया जाएगा)।
try, except। बस fooअपने तर्क की प्रतीक्षा करें जब तक कि elseखंड न हो जाए।
argparse।
argparse.pyसभी कमांड-लाइन प्रोजेक्ट्स में मिल गया हूं।
tryखंड में रख देते हैं ... इसलिए, यह देखते हुए कि यह कठिन नहीं है (और, IMO, थोड़ा प्रेटियर), मैं सिर्फ लंबाई की जांच करना पसंद करता हूं (और भी, आप लोग होने से बचते हैं प्रवाह नियंत्रण के लिए अपवादों का उपयोग करने के लिए आप पर चिल्लाते हैं)।
tryमाफी माँगने वाला हूँ , मुझे मानना होगा। मुझे बस लगता है कि यह कभी-कभी एक ifबयान की तुलना में मेरे इरादे को अधिक स्पष्ट रूप से व्यक्त करता है।
दूसरा तरीका जो मैंने अभी तक सूचीबद्ध नहीं देखा है, वह है समय से पहले अपना प्रहरी मूल्य निर्धारित करना। यह विधि पायथन के आलसी मूल्यांकन का लाभ उठाती है, जिसमें आपको हमेशा एक elseबयान देने की आवश्यकता नहीं होती है । उदाहरण:
startingpoint = 'blah'
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
या अगर आप वाक्य रचना CRAZY जा रहे हैं तो आप पायथन के टर्नरी ऑपरेटर का उपयोग कर सकते हैं :
startingpoint = sys.argv[1] if len(sys.argv) >= 2 else 'blah'
मैं इसका उपयोग करता हूं - यह कभी विफल नहीं होता है:
startingpoint = 'blah'
if sys.argv[1:]:
startingpoint = sys.argv[1]
startingpointवेरिएबल को उदाहरण से हटा सकता हूं , लेकिन सवाल एक फालबैक वेरिएबल को असाइन कर रहा है, इसलिए मैंने सिर्फ वही बनाया है।
sys.argv[1:]:। यह स्थितिगत तर्कों के साथ काम करता है जबकि गिनती नहीं करता है।
यह एक साधारण अजगर की सूची है। इसके लिए आप जो अपवाद पकड़ेंगे, वह IndexError है, लेकिन आप इसके बजाय केवल लंबाई की जांच कर रहे हैं।
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
else:
startingpoint = 'blah'
नक्शे के साथ काम करने वाला एक समाधान निर्मित फोंशन में!
arg_names = ['command' ,'operation', 'parameter']
args = map(None, arg_names, sys.argv)
args = {k:v for (k,v) in args}
फिर आपको बस अपने मापदंडों को इस तरह से कॉल करना होगा:
if args['operation'] == "division":
if not args['parameter']:
...
if args['parameter'] == "euclidian":
...
आप बस argv के लिए argv [1] का मान जोड़ सकते हैं और फिर जाँच सकते हैं कि argv [1] आपके द्वारा इनपुट किए गए स्ट्रिंग के बराबर नहीं है:
from sys import argv
argv.append('SomeString')
if argv[1]!="SomeString":
print(argv[1])
मूल प्रवर्तक जो करने की कोशिश कर रहा था, उसके बहुत करीब है। यहां एक फ़ंक्शन है जिसका मैं उपयोग करता हूं:
def get_arg(index):
try:
sys.argv[index]
except IndexError:
return ''
else:
return sys.argv[index]
तो एक उपयोग कुछ इस तरह होगा:
if __name__ == "__main__":
banner(get_arg(1),get_arg(2))