Вы можете определить настраиваемое действие, которое «запоминает» при первом использовании параметра, а затем вызывает исключение, если оно используется второй раз.
import argparse
class OneTimeAction(argparse._StoreAction):
def __init__(self, *args, **kwargs):
super(OneTimeAction, self).__init__(*args, **kwargs)
self.seen = False
def __call__(self, *args, **kwargs):
if self.seen:
parser = args[0]
option_string = args[3]
parser.error("Cannot use {} a second time".format(option_string))
super(OneTimeAction, self).__call__(*args, **kwargs)
self.seen = True
parser = argparse.ArgumentParser()
parser.add_argument("-cache", "--cache",
action=OneTimeAction,
default="all",
choices=["server-only", "local-only", "all"],
help="Activate Cache by choosing one of the list choices. e.g. -cache=local-only")
В более общем случае вы можете определить это как смешивание, которое будет использоваться с любым видом действия. Следующий пример также сворачивает большую часть конфигурации аргумента в собственное настраиваемое действие.
import argparse
class OneTimeMixin(object):
def __init__(self, *args, **kwargs):
super(OneTimeMixin, self).__init__(*args, **kwargs)
self.seen = False
def __call__(self, *args, **kwargs):
if self.seen:
parser = args[0]
option_string = args[3]
parser.error("Cannot use {} a second time".format(option_string))
super(OneTimeMixin, self).__call__(*args, **kwargs)
self.seen = True
class CacheAction(OneTimeMixin, argparse._StoreAction):
def __init__(self, *args, **kwargs):
# setdefault ensures you can override these if desired
kwargs.setdefault('choices', ["server-only", "local-only", "all"])
kwargs.setdefault('default', 'all')
kwargs.setdefault('help', "Activate Cache by choosing one of the list choices. e.g. -cache=local-only")
super(CacheAction, self).__init__(*args, **kwargs)
parser = argparse.ArgumentParser()
parser.add_argument("-cache", "--cache", action=CacheAction)