Ini tidak baik (juga, karena mencegat semua kesalahan), tetapi:
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(...)
...
Berikut adalah definisi error
fungsi ArgumentParser
kelas:
https://github.com/python/cpython/blob/276eb67c29d05a93fbc22eea5470282e73700d20/Lib/argparse.py#L2374
. Seperti yang Anda lihat, mengikuti tanda tangan, dibutuhkan dua argumen. Namun, fungsi di luar kelas tidak ada yang tahu tentang argumen pertama:, self
karena, secara kasar, ini adalah parameter untuk kelas. (Aku tahu, bahwa Anda tahu ...) demikian, hanya lulus sendiri self
dan message
di _error(...)
tidak bisa (
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error
...
...
akan menampilkan:
...
"AttributeError: 'str' object has no attribute 'print_help'"
). Anda dapat meneruskan parser
( self
) dalam _error
fungsi, dengan memanggilnya:
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error(parser)
...
...
, tetapi Anda tidak ingin keluar dari program, sekarang. Kemudian kembalikan:
def _error(parser):
def wrapper():
parser.print_help()
sys.exit(-1)
return wrapper
...
. Meskipun demikian, parser
tidak tahu, bahwa itu telah dimodifikasi, sehingga ketika kesalahan terjadi, itu akan mengirimkan penyebabnya (omong-omong, terjemahannya yang dilokalkan). Nah, lalu sadap saja:
def _error(parser):
def wrapper(interceptor):
parser.print_help()
sys.exit(-1)
return wrapper
...
. Sekarang, ketika kesalahan terjadi dan parser
akan mengirimkan penyebabnya, Anda akan mencegatnya, lihat ini, dan ... buang.