यह अच्छा नहीं है (क्योंकि, सभी त्रुटियों को स्वीकार करता है), लेकिन:
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
इसका कारण भेजेंगे, तो आप इसे रोकेंगे, इसे देखें, और ... बाहर फेंक दें।