2013-04-15 29 views
3

我有一個小腳本,我需要它能夠接受具有價值和價值的參數。接受有和沒有值的選項

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

我有這個。

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

但是,當我在xml_space中使用--pretty-xml將是'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)