Python argparse: wartość domyślna lub określona wartość

174

Chciałbym mieć opcjonalny argument, który będzie domyślnie przyjmował wartość, jeśli obecna jest tylko flaga bez określonej wartości, ale zapisuje wartość określoną przez użytkownika zamiast wartości domyślnej, jeśli użytkownik określi wartość. Czy jest już dostępna akcja?

Przykład:

python script.py --example
# args.example would equal a default value of 1
python script.py --example 2
# args.example would equal a default value of 2

Mogę utworzyć akcję, ale chciałem sprawdzić, czy istnieje na to sposób.

Obrabować
źródło

Odpowiedzi:

273
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--example', nargs='?', const=1, type=int)
args = parser.parse_args()
print(args)

% test.py 
Namespace(example=None)
% test.py --example
Namespace(example=1)
% test.py --example 2
Namespace(example=2)

  • nargs='?' oznacza 0 lub 1 argumentów
  • const=1 ustawia wartość domyślną, gdy jest 0 argumentów
  • type=int konwertuje argument na int

Jeśli chcesz test.pyustawić examplena 1, nawet jeśli nie --exampleokreślono, włącz default=1. To znaczy z

parser.add_argument('--example', nargs='?', const=1, type=int, default=1)

następnie

% test.py 
Namespace(example=1)
unutbu
źródło
Jak to zrobić ze sznurkami? Mam dylemat z rozróżnieniem „” (domyślnie pusty ciąg) i „” (pusty ciąg wprowadzony przez użytkownika). W kodzie na razie używam wartości domyślnej, a ponieważ muszę wykonać kilka operacji, mam coś takiego self.foo = (args.bar or some_else_source).upper(). Zepsuje się na żadnym obiekcie AFAIUC.
0andriy
16

Właściwie wystarczy użyć defaultargumentu add_argumenttak, jak w tym test.pyskrypcie:

import argparse

if __name__ == '__main__':

    parser = argparse.ArgumentParser()
    parser.add_argument('--example', default=1)
    args = parser.parse_args()
    print(args.example)

test.py --example
% 1
test.py --example 2
% 2

Szczegóły tutaj .

Adam Erickson
źródło
7

Różnica pomiędzy:

parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1, default=7)

i

parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1)

jest więc:

myscript.py => debugowanie to 7 (domyślnie) w pierwszym przypadku i „Brak” w drugim

myscript.py --debug => debugowanie wynosi 1 w każdym przypadku

myscript.py --debug 2 => debugowanie wynosi 2 w każdym przypadku

Murray
źródło