Podczas korzystania z czegoś takiego z argpara:

parser.add_argument("-option1", type=int, nargs=1, default=1, choices=xrange(1, 10), help="option 1 message")

Jeśli argument nie zostanie przekazany, args.option1 jest liczbą całkowitą. Jeśli zostanie przekazany argument, args.Option to lista.

Co oznacza, że muszę używać albo argt.option1 lub args.option1 [0]. Czy można tego uniknąć?

2
Bob 17 sierpień 2014, 02:40

2 odpowiedzi

Najlepsza odpowiedź

Jeśli ustawisz nargs do liczby całkowitej, argument zawsze będzie listą, gdy określono. Możesz użyć '?' zamiast tego, aby ustawić go do pojedynczej wartości lub domyślnie:

parser.add_argument(
    "-option1", type=int, nargs='?', default=1, 
    choices=xrange(1, 10), help="option 1 message")

Z {x0}} Dokumentacja:

  • N (Integer). N Argumenty z linii poleceń zostaną zebrane razem do listy.

[…]

  • '?'. Jeden argument zostanie spożywany z linii poleceń, jeśli to możliwe, a wyprodukowano jako pojedynczy element . Jeśli nie ma argumentu wiersza polecenia, zostanie wytworzona wartość z domyślna wartość.

Kopalnia nacisk. prawdopodobnie chcesz ustawić const, jak również, jeśli ktoś używa tylko -option1 na linii poleceń bez wartości następującej; Bez const Wartość jest następnie ustawiona na None. Wystarczy ustawić go w tej samej wartości co domyślnie:

parser.add_argument(
    "-option1", type=int, nargs='?', default=1, const=1,
    choices=xrange(1, 10), help="option 1 message")

Inną opcją jest , a nie Set nargs:

parser.add_argument(
    "-option1", type=int, default=1, 
    choices=xrange(1, 10), help="option 1 message")

Zwykle oznacza to prawie tak samo jak nargs='?':

Jeśli nie jest podana żadna argument słów kluczowych nargs, liczba spożywanych argumentów jest określona przez działanie. Ogólnie oznacza to, że jeden argument linii polecenia zostanie spożywany i zostanie wyprodukowany pojedynczy element (nie lista).

Z różnicą jest to, że argument jest pusty -option1 na linii poleceń nie jest dozwolone; No const należy ustawić.

Próbny:

>>> from argparse import ArgumentParser
>>> parser = ArgumentParser()
>>> parser.add_argument(
...     "-option1", type=int, nargs='?', default=1, const=1,
...     choices=xrange(1, 10), help="option 1 message")
_StoreAction(option_strings=['-option1'], dest='option1', nargs='?', const=1, default=1, type=<type 'int'>, choices=xrange(1, 10), help='option 1 message', metavar=None)
>>> parser.parse_args(['-option1', '4'])  # option with argument
Namespace(option1=4)
>>> parser.parse_args(['-option1'])       # option with *no* argument
Namespace(option1=1)
>>> parser.parse_args([])                 # option not specified
Namespace(option1=1)
>>> parser = ArgumentParser()
>>> parser.add_argument(
...     "-option1", type=int, default=1, 
...     choices=xrange(1, 10), help="option 1 message")
_StoreAction(option_strings=['-option1'], dest='option1', nargs=None, const=None, default=1, type=<type 'int'>, choices=xrange(1, 10), help='option 1 message', metavar=None)
>>> parser.parse_args(['-option1', '4'])  # option with argument
Namespace(option1=4)
>>> parser.parse_args([])                 # option not specified
Namespace(option1=1)
>>> parser.parse_args(['-option1'])       # option with *no* argument
usage: [-h] [-option1 {1,2,3,4,5,6,7,8,9}]
: error: argument -option1: expected one argument
2
Martijn Pieters 16 sierpień 2014, 22:53

Otrzymujesz listę, ponieważ ustawisz nargs=1 w argumentach do add_argument. Jest to również opisane w Dokumenty:

Należy pamiętać, że nargs=1 wytwarza listę jednego elementu. Jest to inne niż domyślne, w którym przedmiot jest wytwarzany sam.

Jeśli usuniesz nargs=1, powinien wytworzyć pozycję na własną rękę zgodnie z pożądanym (z argumentu, jeśli zostanie podane, w przeciwnym razie z default). Jeśli chcesz, aby numer opcjonalny (tj. Zezwalaj również na -option1 bez argumentu), użyj nargs='?' i ustaw const jako wartość domyślna w tej sprawie.

1
hlt 16 sierpień 2014, 22:53