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.

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)

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 .


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.