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 时将是“无”。如果我不在 xml_space 中写入此参数,则存储默认值。我需要完全相反的。

4

2 回答 2

6

使用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)
于 2013-04-16T15:42:22.390 回答
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)
于 2013-04-15T21:09:10.877 回答