Điều này không tốt (cũng vậy, vì chặn tất cả các lỗi), nhưng:
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(...)
...
Dưới đây là định nghĩa về errorchức năng của ArgumentParserlớp:
https://github.com/python/cpython/blob/276eb67c29d05a93fbc22eea5470282e73700d20/Lib/argparse.py#L2374
. Như bạn thấy, sau chữ ký, phải mất hai đối số. Tuy nhiên, các hàm bên ngoài lớp không biết gì về đối số đầu tiên : self, bởi vì, đại khái, đây là tham số cho lớp. (Tôi biết, bạn biết ...) Qua đó, chỉ cần vượt qua riêng selfvà messagetrong _error(...)không có thể (
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error
...
...
sẽ xuất ra:
...
"AttributeError: 'str' object has no attribute 'print_help'"
). Bạn có thể truyền parser( self) trong _errorhàm, bằng cách gọi nó:
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error(parser)
...
...
, nhưng bạn không muốn thoát khỏi chương trình, ngay bây giờ. Sau đó trả lại:
def _error(parser):
def wrapper():
parser.print_help()
sys.exit(-1)
return wrapper
...
. Tuy nhiên, parserkhông biết rằng nó đã được sửa đổi, do đó, khi xảy ra lỗi, nó sẽ gửi nguyên nhân của nó (nhân tiện, bản dịch được bản địa hóa của nó). Chà, sau đó chặn nó lại:
def _error(parser):
def wrapper(interceptor):
parser.print_help()
sys.exit(-1)
return wrapper
...
. Bây giờ, khi xảy ra lỗi và parsersẽ gửi nguyên nhân của nó, bạn sẽ chặn nó, xem xét điều này và ... ném ra ngoài.