এটি ভাল নয় (এছাড়াও, কারণ সমস্ত ত্রুটিটিকে বাধা দেয়) তবে:
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
কারণ প্রেরণ করবেন, আপনি এটিকে আটকাবেন, এটি দেখুন এবং ... ফেলে দিন।