Option accepted with and without value

℡╲_俬逩灬. 提交于 2019-12-04 04:18:13

问题


I have a small script and I need it to be able to accept parameter with value and withou value.

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

I have this.

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

But when I use --pretty-xml in xml_space will be 'none'. If I dont write this parameter in xml_space is stored the default value. I would need the exact opposite.


回答1:


Leave out the default parameter and use a custom Action instead:

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)

Demo:

>>> 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)



回答2:


Use the const keyword:

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']))

results in

Namespace(xml_space=None)
Namespace(xml_space=4)
Namespace(xml_space=5)


来源:https://stackoverflow.com/questions/16024635/option-accepted-with-and-without-value

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!