Argumento Python: argumento de linha de comando que pode ser nomeado ou posicional
Eu estou tentando fazer um programa em Python que usa oargparse
módulo para analisar as opções de linha de comando.
Eu quero fazer um argumento opcional que pode ser nomeado ou posicional. Por exemplo, eu queromyScript --username=batman
fazer o mesmo quemyScript batman
. Eu também queromyScript
sem um nome de usuário para ser válido. Isso é possível? Se sim, como isso pode ser feito?
Eu tentei várias coisas semelhantes ao código abaixo, sem qualquer sucesso.
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-u", "--user-name", default="admin")
group.add_argument("user-name", default="admin")
args = parser.parse_args()
EDITAR: O código acima lança uma exceção dizendoValueError: mutually exclusive arguments must be optional
.
Eu estou usando o Python 2.7.2 no OS X 10.8.4.
EDITAR: Eu tentei a sugestão de Gabriel Jacobsohn, mas não consegui que funcionasse corretamente em todos os casos.
Eu tentei isso:
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-u", "--user-name", default="admin", nargs="?")
group.add_argument("user_name", default="admin", nargs="?")
args = parser.parse_args()
print(args)
e correndomyScript batman
imprimiriaNamespace(user_name='batman')
, masmyScript -u batman
emyScript --user-name=batman
imprimiriaNamespace(user_name='admin')
.
Eu tentei mudar o nomeuser-name
parauser_name
no 1ºadd_argument
linha e que às vezes resultou em ambosbatman
eadmin
no namespace ou um erro, dependendo de como eu corri o programa.
Eu tentei mudar o nomeuser_name
parauser-name
no dia 2add_argument
linha, mas que iria imprimir tantoNamespace(user-name='batman', user_name='admin')
ouNamespace(user-name='admin', user_name='batman')
, dependendo de como eu corri o programa.