我使用arparse更新使用命令行上指定的值一个配置字典。因为我只想更新在其中一个值显式地在命令行中提到的配置价值。
因此,我试图通过检查每个动作如果getattr(args, action.dest) == action.default
或类型的平等转换ARG以识别未指定的自变量。然后更新我的字典,也是它假所有值。
但是,这当然是失败,如果我明确地指定命令行是一样的我的默认参数上的参数。有没有一种可能,以确定这些明确提到的参数withing argparser或我必须手动识别他们在sys.argv中?
谢谢!
编辑:
为了使我的意图更加清晰。我有如下所示的参数:
parser.add_argument('--test', default='meaningful_default')
和配置类似
config = { 'test' : 'nondefault_val'}
现在我想只有在明确指定的参数更新配置。因为我不跟这恰好是也是默认值的值再次指定类似prog.py --test meaningful_default
来更新我的配置比较ARGS使用默认值属性的作品,只要
所述parser
维护seen_actions
集对象在解析(在_parse_known_args
方法)。在解析它的最后检查这一套对必需的参数(与required=True
的),并且可以发出一个错误。的变化也可用于与相互排斥的组。
但这种变量不是可用的功能之外。所以短期某种“钩子”,让你的parse_args
动作中运用自己的测试的,最好的选择是测试的默认值。或者,你可以看看sys.argv[1:]
。
默认default
是None
。这是因为你的用户不能给这个值就是为了这个目的很好。也就是说,没有字符串转换为None
(至少不是在任何正常type
方法)。
parser.add_argument('--foo') # default=None
...
if args.foo is None:
# clearly foo has not been specified.
args.foo = 'the real default'
else:
# foo was specified
pass
您可以使用自定义的行动告诉如果ARG值默认或命令行设置:
import argparse
class FooAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, values)
setattr(namespace, self.dest+'_nondefault', True)
parser = argparse.ArgumentParser()
parser.add_argument('--test0', default='meaningful_default', action=FooAction)
parser.add_argument('--test1', default='meaningful_default', action=FooAction)
args = parser.parse_args('--test0 2'.split())
if hasattr(args, 'test0_nondefault'):
print('argument test0 set on command line')
else:
print('default value of test0 is used')
if hasattr(args, 'test1_nondefault'):
print('argument test1 set on command line')
else:
print('default value of test1 is used')
如果你喜欢使用argparse,并可以指定默认值,则使用两个解析器一个简单的解决方案。
一,定义你的主分析器和分析适当默认所有的参数:
parser = argparse.ArgumentParser()
parser.add_argument('--test1', default='meaningful_default1')
parser.add_argument('--test2', default='meaningful_default2')
...
args, unparsed = parser.parse_known_args()
II。定义一个辅助分析器与argument_default=argparse.SUPPRESS
排除未指定的参数。从主分析器,但没有任何默认添加的所有参数:
aux_parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)
for arg in vars(args): aux_parser.add_argument('--'+arg)
cli_args, _ = aux_parser.parse_known_args()
这不是一个非常优雅的解决方案,但与argparse及其所有的福利效果很好。
您可以使用“const”和“default”的组合来模拟你想要什么。 “nargs”在这种情况下要'?'
。例如:
args_group.add_argument('--abc',
metavar='',
nargs='?',
action='store',
const='github.com',
default='',
help='blabla [ default: %(const)s ]')
然后abc
的价值将是如下给出不同的命令行参数。
ABC不是在命令行:
ABC =
--abc
:
ABC = github.com
--abc stackoverflow.com
:
ABC = stackoverflow.com
所以,你会知道abc
不会出现在命令行中时,它的空白,例如:
if not args.abc:
# to something