Đ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ề error
chức năng của ArgumentParser
lớ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 self
và message
trong _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 _error
hà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, parser
khô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à parser
sẽ 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.