使用argparse和相同的dest属性设置默认值

时间:2013-01-01 12:28:32

标签: python argparse

这是一个简单的例子。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-a', action = 'append_const', dest = 'letter', const = 'a')
parser.add_argument('-b', action = 'append_const', dest = 'letter', const = 'b')
parser.set_defaults(letter = ['a', 'b'])
print(parser.parse_args('-a'.split()))
print(parser.parse_args('-b'.split()))
print(parser.parse_args(''.split()))

结果:

Namespace(letter=['a', 'b', 'a'])
Namespace(letter=['a', 'b', 'b'])
Namespace(letter=['a', 'b'])

如果没有set_defaults行,结果为:

Namespace(letter=['a'])
Namespace(letter=['b'])
Namespace(letter=None)

如何为这样的结果配置argparse?

Namespace(letter=['a'])
Namespace(letter=['b'])
Namespace(letter=['a', 'b'])

2 个答案:

答案 0 :(得分:0)

您应该存储cost而不是追加,使用action 'store_const'doc):

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-a', action = 'store_const', dest = 'letter', const = 'a')
parser.add_argument('-b', action = 'store_const', dest = 'letter', const = 'b')
parser.set_defaults(letter = ['a', 'b'])
print(parser.parse_args('-a'.split()))
print(parser.parse_args('-b'.split()))
print(parser.parse_args(''.split()))

结果:

Namespace(letter='a')
Namespace(letter='b')
Namespace(letter=['a', 'b'])

答案 1 :(得分:0)

正如其他人所提到的,store_const 几乎做了你想做的事,除了(正如@Theodros Zelleke指出的那样)-ab无法正确解析。我认为解决该问题的最简单方法是在调用parse_args之后简单处理无参数的情况:

import argparse
import sys

def parse_args(argv = sys.argv[1:]):
    parser = argparse.ArgumentParser()
    parser.add_argument('-a', action = 'append_const', dest = 'letter', const = 'a')
    parser.add_argument('-b', action = 'append_const', dest = 'letter', const = 'b')
    args = parser.parse_args(argv)
    if args.letter is None:
        args.letter = ['a','b']
    return args

print(parse_args('-a'.split()))
print(parse_args('-b'.split()))
print(parse_args('-ab'.split()))
print(parse_args(''.split()))

产量

Namespace(letter=['a'])
Namespace(letter=['b'])
Namespace(letter=['a', 'b'])
Namespace(letter=['a', 'b'])