2013-04-15 3 views
3

У меня есть небольшой скрипт, и мне нужно, чтобы он мог принимать параметр со значением и значением withou.Опция, принятая с и без значения

./cha.py --pretty-xml 
./cha.py --pretty-xml=5 

У меня есть это.

parser.add_argument('--pretty-xml', nargs='?', dest='xml_space', default=4) 

Но когда я использую --pretty-xml в xml_space, будет «none». Если я не буду писать этот параметр в xml_space, будет сохранено значение по умолчанию. Мне нужна была бы полная противоположность.

ответ

0

Оставьте из параметра default и использовать пользовательские Action вместо:

class PrettyXMLAction(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string=None): 
     if not values: 
      values = 4 
     setattr(namespace, self.dest, values) 

parser.add_argument('--pretty-xml', nargs='?', type=int, dest='xml_space', action=PrettyXMLAction) 

Демо:

>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('--pretty-xml', nargs='?', type=int, dest='xml_space', action=PrettyXMLAction) 
PrettyXMLAction(option_strings=['--pretty-xml'], dest='xml_space', nargs='?', const=None, default=None, type=None, choices=None, help=None, metavar=None) 
>>> parser.parse_args('--pretty-xml'.split()) 
Namespace(xml_space=4) 
>>> parser.parse_args('--pretty-xml=5'.split()) 
Namespace(xml_space=5) 
>>> parser.parse_args(''.split()) 
Namespace(xml_space=None) 
+0

Работал отлично, спасибо вам большое. –

3

Используйте const ключевое слово:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("--pretty-xml", nargs="?", type=int, dest="xml_space", const=4) 
print(parser.parse_args([])) 
print(parser.parse_args(['--pretty-xml'])) 
print(parser.parse_args(['--pretty-xml=5'])) 

результаты в

Namespace(xml_space=None) 
Namespace(xml_space=4) 
Namespace(xml_space=5) 
Смежные вопросы