यह अच्छा नहीं है (क्योंकि, सभी त्रुटियों को स्वीकार करता है), लेकिन:
def _error(parser):
def wrapper(interceptor):
parser.print_help()
sys.exit(-1)
return wrapper
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error(parser)
parser.add_argument(...)
...
यहाँ कक्षा के errorकार्य की परिभाषा है ArgumentParser:
https://github.com/python/cpython/blob/276eb67c29d05a93fbc22eea5470282e73700d20/Lib/argparse.py#L2374
। जैसा कि आप देखते हैं, हस्ताक्षर के बाद, यह दो तर्क लेता है। हालाँकि, कक्षा के बाहर के कार्य पहले तर्क के बारे में कुछ भी नहीं जानते हैं: selfक्योंकि, मोटे तौर पर, यह कक्षा के लिए पैरामीटर है। (मुझे पता है, कि तुम्हें पता है ...) जिससे, बस पास selfऔर खुद messageमें _error(...)नहीं है (
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error
...
...
उत्पादन होगा:
...
"AttributeError: 'str' object has no attribute 'print_help'"
)। आप इसे कॉल करके फ़ंक्शन में parser( self) पास कर सकते हैं _error:
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error(parser)
...
...
, लेकिन आप अभी कार्यक्रम से बाहर नहीं जाना चाहते हैं। फिर इसे वापस करें:
def _error(parser):
def wrapper():
parser.print_help()
sys.exit(-1)
return wrapper
...
। बहरहाल, parserयह नहीं जानता कि इसे संशोधित किया गया है, इस प्रकार जब कोई त्रुटि होती है, तो वह इसका कारण (वैसे, इसका स्थानीय अनुवाद) भेजेगा। ठीक है, तो इसे रोकें:
def _error(parser):
def wrapper(interceptor):
parser.print_help()
sys.exit(-1)
return wrapper
...
। अब, जब त्रुटि होती है और parserइसका कारण भेजेंगे, तो आप इसे रोकेंगे, इसे देखें, और ... बाहर फेंक दें।