这是另一个尝试编写自定义Action类的例子
import argparse
class FooAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, values)
defaultbar = getattr(namespace, 'bar')
try:
defaultbar = defaultbar%values
except TypeError:
pass
setattr(namespace, 'bar', defaultbar)
parser = argparse.ArgumentParser()
parser.add_argument("--foo", required=True, action=FooAction)
parser.add_argument("--bar", default="%s_BAR")
args = parser.parse_args(['--foo', 'Foo', '--bar', 'Bar'])
args = parser.parse_args(['--foo', 'Foo'])
args = parser.parse_args(['--bar', 'Bar', '--foo', 'Foo'])
请注意,该类必须知道--bar
参数的dest
。同时,我使用'%s_BAR'
来区分默认值和非默认值。这处理了--bar
出现在--foo
之前的情况。
使这种方法复杂的因素包括:
- 默认值在
add_argument
时间评估。
- 默认值在
parse_args
开始时放置在名称空间中。
- 标记(可选)参数可以以任何顺序出现
Action
类没有设计用于处理交互参数。
- 在默认情况下,
bar
操作将不会被调用。
bar
默认值可以是函数,但是必须在parse_args
之后检查是否需要评估它。
虽然这个自定义操作做到了这一点,但我仍然认为我其他答案中的addbar
函数是一个更清晰的解决方案。