2013-08-01 6 views
2

У меня есть простой скрипт argparse, который принимает два аргумента; --encode и --decode. Я хочу сделать по умолчанию --decode, если аргумент не указан. Как я могу это сделать?Как сделать аргумент default, если аргумент не передан?

Я хочу это:

myscript.py --decode "some encoded string here" 

произойдет, когда я делаю:

myscript.py "some encoded string here" 

по умолчанию.

+0

Что вы имеете в виду под «сделать' -decode' по умолчанию»? Вы не применяете аргументы по умолчанию, вы указываете атрибуты в значениях по умолчанию для пространства имен. Как вы хотите, чтобы пространство имен выглядело? Это то, что вы будете обрабатывать с остальной частью вашего кода. – hpaulj

ответ

0

В argparse.ArgumentParser() объекта при использовании метода: add_argument это флаг default="some value", например:

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

выход:

>python test.py 
Namespace(test=None) 

добавить флаг по умолчанию:

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

после add_argument изменить:

>python test.py 
Namespace(test=2) 
3

Посмотрите на 'store_true' action на python documentation, или даже default keyword on the add argument method

Вам нужно реализовать некоторую логику, но вот идея:

parser.add_argument('--decode', rest_of_options..., default=True) 
parser.add_argument('--encode', rest_of_options..., default=False) 

values = parser.parse_args() 

if values.decode: 
    do_some_stuff 
elif values.encode: 
    do_some_other_stuff 
+0

Я обновил вопрос .. –

+0

Затем вам нужно будет использовать действие 'store_true', а также позиционные аргументы http://docs.python.org/2/library/argparse.html#name-or-flags – Paco

+0

Возможно, также захотите включить эти опции в взаимоисключающую группу, чтобы пользователи не могли этого сделать, например '--encode --decode'. – nneonneo

0

Вы можете использовать default для указания значения по умолчанию, а также dest для управления переменным именем опции:

import argparse 
p = argparse.ArgumentParser() 
# --decode and --encode are usually considered mutually exclusive; this enforces that constraint 
g = p.add_mutually_exclusive_group() 
# Order matters: the first default for a given dest is used 
g.add_argument('--decode', dest='action', action='store_const', const='decode', default='decode') 
g.add_argument('--encode', dest='action', action='store_const', const='encode') 
0

Это приблизительно то, что вы хотите, пропавших без вести, кроме «-»

p.add_argument('action',choices=['decode','encode'],default='decode',nargs='?') 
p.add_argument('astring') 

In [8]: p.parse_args(["a string"]) 
Out[8]: Namespace(action='decode', astring='a string') 

In [9]: p.parse_args(['decode',"a string"]) 
Out[9]: Namespace(action='decode', astring='a string') 

In [10]: p.parse_args(['encode',"a string"]) 
Out[10]: Namespace(action='encode', astring='a string') 

Если вы должны иметь «-», решение nneonneo в порядке, производя те же пространства имен. Оба аргумента записываются в один и тот же атрибут назначения, и этот атрибут по умолчанию является «декодировать».

p.add_argument('--decode', dest='action', action='store_const', const='decode', default='decode') 
p.add_argument('--encode', dest='action', action='store_const', const='encode') 

Если вы не используете взаимоисключающие группы, последний аргумент будет иметь последнее слово ('--decode --encode "a string to be encoded"')

Смежные вопросы