如何找出是否argparse说法在命令行中指定的实际?

问题描述 投票:12回答:4

我使用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使用默认值属性的作品,只要

python argparse
4个回答
4
投票

所述parser维护seen_actions集对象在解析(在_parse_known_args方法)。在解析它的最后检查这一套对必需的参数(与required=True的),并且可以发出一个错误。的变化也可用于与相互排斥的组。

但这种变量不是可用的功能之外。所以短期某种“钩子”,让你的parse_args动作中运用自己的测试的,最好的选择是测试的默认值。或者,你可以看看sys.argv[1:]

默认defaultNone。这是因为你的用户不能给这个值就是为了这个目的很好。也就是说,没有字符串转换为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

2
投票

您可以使用自定义的行动告诉如果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')

0
投票

如果你喜欢使用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及其所有的福利效果很好。


0
投票

您可以使用“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
© www.soinside.com 2019 - 2024. All rights reserved.