argparse默认选项基于另一个选项 [英] argparse default option based on another option
问题描述
假设我有一个argparse python脚本:
Suppose I have an argparse python script:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--foo", required=True)
现在,我想添加另一个选项--bar,它将默认为在--foo参数指定的内容后面附加"_BAR".
Now I want to add another option --bar, which would default to appending "_BAR" to whatever was specified by --foo argument.
我的目标:
>>> parser.parse_args(['--foo', 'FOO'])
>>> Namespace(foo='FOO', bar="FOO_BAR")
AND
>>> parser.parse_args(['--foo', 'FOO', '--bar', 'BAR'])
>>> Namespace(foo='FOO', bar="BAR")
我需要这样的东西:
parser.add_argument("--bar", default=get_optional_foo + "_BAR")
推荐答案
这是编写自定义Action类的另一种尝试
Here's another attempt at writing a custom Action class
import argparse
class FooAction(argparse.Action):
# adapted from documentation
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, values)
defaultbar = getattr(namespace, 'bar')
try:
defaultbar = defaultbar%values
except TypeError:
# BAR has already been replaced
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'])
# Namespace(bar='Bar', foo='Foo')
args = parser.parse_args(['--foo', 'Foo'])
# Namespace(bar='Foo_BAR', foo='Foo')
args = parser.parse_args(['--bar', 'Bar', '--foo', 'Foo'])
# Namespace(bar='Bar', foo='Foo')
请注意,该类必须知道--bar
参数的dest
.另外,我使用'%s_BAR'
可以轻松地区分默认值和非默认值.这样可以处理--bar
出现在--foo
之前的情况.
Note that the class has to know the dest
of the --bar
argument. Also I use a '%s_BAR'
to readily distinguish between a default value, and a non default one. This handles the case where --bar
appears before --foo
.
使这种方法复杂化的是:
Things that complicate this approach are:
- 默认值在
add_argument
时间评估. - 默认值放置在
parse_args
开头的命名空间中. - 已标记(可选)的参数可以按任何顺序出现
-
Action
类不适用于处理交互参数. - 在默认情况下,不会调用
bar
操作. -
bar
默认值可以是一个函数,但是在parse_args
之后必须检查是否需要对其进行评估.
- default values are evaluated at
add_argument
time. - default values are placed in the Namespace at the start of
parse_args
. - flagged (optionals) arguments can occur in any order
- the
Action
class is not designed to handle interacting arguments. - the
bar
action will not be called in the default case. - the
bar
default could be a function, but something would have to check afterparse_args
whether it needs to be evaluated or not.
尽管此自定义Action可以解决问题,但我仍然认为我的其他答案中的addbar
函数是更干净的解决方案.
While this custom Action does the trick, I still think the addbar
function in my other answer is a cleaner solution.
这篇关于argparse默认选项基于另一个选项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!