Jak mgilson suggestednargs=0
załatwia sprawę. Ponieważ jest to wewnętrzna do działania, chciałbym umieścić go wewnątrz działania:
class StartAction(argparse.Action):
def __init__(self, nargs=0, **kw):
super().__init__(nargs=nargs, **kw)
def __call__(self, parser, namespace, values, option_string=None):
print "Hello"
start.add_argument('-s', '--start', action=StartAction)
I masz pożądanego zachowania bez redundancji konieczności dodawania nargs=0
każdej add_argument()
rozmowy. Zgrabne, jeśli masz wiele argumentów działających w ten sam sposób.
Jednak użytkownicy mogą nadal przesłonić domyślną wartość nargs=0
, co jest głupie w przypadku użycia, co zostało zademonstrowane w pytaniu. Więc wymuszam to:
class StartAction(argparse.Action):
def __init__(self, nargs=0, **kw):
if nargs != 0:
raise ValueError('nargs for StartAction must be 0; it is '
'just a flag.')
super().__init__(nargs=nargs, **kw)
def __call__(self, parser, namespace, values, option_string=None):
print "Hello"
ValueError: nargs dla akcji sklepu musi być> 0; jeśli nie masz nic do przechowywania, bardziej odpowiednie mogą być takie działania, jak zapisanie prawdziwej lub zapisanie stałej. – Lucina
Nie zgadzam się z komentarzem @Lucina. Możesz wywołać akcję niestandardową, aby uzyskać bezproblemowe odwzorowanie między analizą argumentów a złożonymi działaniami. Preferuję obiekty Action, które zachowują się jak parametry CLI, więc mam polimorfizm między interfejsem CLI a obiektem, który go obsługuje. – Daniel