2012-06-12 15 views
9
class StartAction(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string=None): 
     print "Hello" 

start.add_argument('-s', '--start', action=StartAction) 

Wiem, że posiadanie akcji o nazwie "store_true" uniemożliwiłoby wymaganie argumentu, ale czy istnieje sposób użycia niestandardowej akcji i nadal nie wymaga podania argumentu?Argparse - działanie niestandardowe bez argumentów?

Więc co chcę jest:

python example.py -s

Hello

Odpowiedz

15

spróbuj dodać nargs=0 do swojej start.add_argument:

start.add_argument('-s', '--start', action=StartAction, nargs=0) 
+1

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

+1

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

3

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" 
Powiązane problemy