CLI选项,它是python中两个其他选项和优先级的聚合

时间:2015-10-21 16:31:48

标签: python python-2.7 argparse

我使用argparse解析Python脚本中的CLI选项。我会创建一个标志,相当于指定另外两个标志。所以

python myscript.py --flagc

相当于

python myscript.py --flaga --flagb

这是我的代码:

args = parser.parse_args()

if args.flagc:
    args.flaga = True
    args.flagb = True

问题是flaga,而flagb也有相反的标记,no-flagano-flagb

parser.add_argument("--flaga", dest="flaga", action="store_true")
parser.add_argument("--no-flaga", dest="flaga", action="store_false")
parser.set_defaults(flaga=False)

等等。所以我可能遇到标志优先级问题。例如,如果我用:

调用脚本
python myscript.py --flagc --no-flaga

True获得args.flaga,但通常您需要False,因为上一个标志优先。

我该如何管理?

1 个答案:

答案 0 :(得分:0)

是的,通过在解析后处理mapPartitions,您将丢失优先级信息。通常这个问题支持这种后期处理,但这里的自定义Action可能是更好的选择。

flag_c

打印:

class MyAction(argparse._StoreTrueAction):
    def __call__(self, parser, namespace, values, option_string=None):
        # adapt from _StoreConst
        # leave the self.dest set; could deactivate
        setattr(namespace, self.dest, self.const)
        setattr(namespace, 'flaga', True)
        setattr(namespace, 'flagb', True)

parser.add_argument("--flagc", action=MyAction)

print(parser.parse_args('--flaga'.split()))
print(parser.parse_args('--flagc'.split()))
print(parser.parse_args('--flagc --no-flaga'.split()))

这是完成这项工作的最简单的自定义类。它利用了其父级设置的默认值(特别是1027:~/mypy$ python stack33264649.py Namespace(flaga=True, flagb=False, flagc=False) Namespace(flaga=True, flagb=True, flagc=True) Namespace(flaga=False, flagb=True, flagc=True) )。或者,它可以基于nargs=0甚至_StoreConst

我离开了Action。准确指出是否调用setattr(namespace, self.dest, self.const)对于确定指标并没有什么害处。它比试图压制--flagc默认值更简单。

好的,压制默认值并不困难:

flagc