Argparse do Python: valor padrão ou valor especificado

174

Gostaria de ter um argumento opcional que assumirá o valor padrão se apenas o sinalizador estiver presente sem nenhum valor especificado, mas armazene um valor especificado pelo usuário em vez do padrão se o usuário especificar um valor. Já existe uma ação disponível para isso?

Um exemplo:

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

Posso criar uma ação, mas queria ver se havia uma maneira existente de fazer isso.

Roubar
fonte

Respostas:

272
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='?' significa argumentos 0 ou 1
  • const=1 define o padrão quando há 0 argumentos
  • type=int converte o argumento em int

Se você deseja test.pydefinir examplecomo 1 mesmo se não --examplefor especificado, inclua default=1. Ou seja, com

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

então

% test.py 
Namespace(example=1)
unutbu
fonte
Como fazer isso com strings? Eu tenho um dilema com diferenciação de "" (sequência vazia como padrão) e "" (sequência vazia conforme inserida pelo usuário). No código, por enquanto, estou usando o padrão e, como preciso fazer algumas operações, tenho algo parecido com isto self.foo = (args.bar or some_else_source).upper(). Ele será interrompido no objeto Nenhum AFAIUC.
0andriy
16

Na verdade, você só precisa usar o defaultargumento add_argumentcomo neste test.pyscript:

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

Os detalhes estão aqui .

Adam Erickson
fonte
7

A diferença entre:

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

e

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

é assim:

myscript.py => debug é 7 (do padrão) no primeiro caso e "None" no segundo

myscript.py --debug => debug é 1 em cada caso

myscript.py --debug 2 => debug é 2 em cada caso

Murray
fonte