Bu iyi değil (ayrıca, tüm hataları kestiği için), ancak:
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(...)
...
İşte sınıfın error
fonksiyonunun tanımı ArgumentParser
:
https://github.com/python/cpython/blob/276eb67c29d05a93fbc22eea5470282e73700d20/Lib/argparse.py#L2374
. Gördüğünüz gibi, imzayı takiben iki argüman alıyor. Ancak, sınıf dışındaki işlevler ilk argüman hakkında hiçbir şey bilmez: self
çünkü kabaca konuşmak gerekirse, bu sınıf için bir parametredir. Böylece, sadece kendi pass (ı ... bildiğine göre, biliyorum) self
ve message
de _error(...)
(olamaz
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error
...
...
çıktı olacak:
...
"AttributeError: 'str' object has no attribute 'print_help'"
). İşlevde parser
( self
) _error
işlevini çağırarak iletebilirsiniz :
def _error(self, message):
self.print_help()
sys.exit(-1)
def _args_get(args=sys.argv[1:]):
parser = argparser.ArgumentParser()
parser.error = _error(parser)
...
...
, ancak şu anda programdan çıkmak istemiyorsunuz. Sonra iade et:
def _error(parser):
def wrapper():
parser.print_help()
sys.exit(-1)
return wrapper
...
. Bununla birlikte, parser
değiştirildiğini bilmiyor, bu nedenle bir hata oluştuğunda, bunun nedenini gönderecek (bu arada, yerelleştirilmiş çevirisi). Peki, o zaman kesiş:
def _error(parser):
def wrapper(interceptor):
parser.print_help()
sys.exit(-1)
return wrapper
...
. Şimdi, hata oluştuğunda ve parser
bunun nedenini göndereceği zaman, onu kesecek, şuna bakacak ve ... atacaksınız.