gpt4 book ai didi

Python `argparse` : Is there a clean way to add a flag that sets multiple flags (e. g。 `--all`“等同于 `--x --y`)

转载 作者:行者123 更新时间:2023-12-03 17:26:59 31 4
gpt4 key购买 nike

我有一些Python argparse命令行处理代码,最初看起来像这样:

import argparse

ap = argparse.ArgumentParser()

ap.add_argument("--x", help = "Set `x`.", action = "store_true", default = False)
ap.add_argument("--y", help = "Set `y`.", action = "store_true", default = False)

ap.add_argument(
"--all", help = "Equivalent to `--x --y`.",
action = "store_true", default = False
)

args = ap.parse_args()

if args.all:
args.x = True
args.y = True

print "args.x", args.x
print "args.y", args.y

基本思想:我有一些 bool 标志可以切换特定设置( --x--y等),并且我想添加一个便捷选项来切换多个设置-例如 --all等效于 --x --y

我想避免 ArgumentParser中没有包含的任何命令行处理逻辑,都不要在 parse_args中完成,因此我想出了使用自定义 argparse.Action s的此解决方案:
import argparse

def store_const_multiple(const, *destinations):
"""Returns an `argparse.Action` class that sets multiple argument
destinations (`destinations`) to `const`."""
class store_const_multiple_action(argparse.Action):
def __init__(self, *args, **kwargs):
super(store_const_multiple_action, self).__init__(
metavar = None, nargs = 0, const = const, *args, **kwargs
)

def __call__(self, parser, namespace, values, option_string = None):
for destination in destinations:
setattr(namespace, destination, const)

return store_const_multiple_action

def store_true_multiple(*destinations):
"""Returns an `argparse.Action` class that sets multiple argument
destinations (`destinations`) to `True`."""
return store_const_multiple(True, *destinations)

ap = argparse.ArgumentParser()

ap.add_argument("--x", help = "Set `x`.", action = "store_true", default = False)
ap.add_argument("--y", help = "Set `y`.", action = "store_true", default = False)

ap.add_argument(
"--all", help = "Equivalent to `--x --y`.",
action = store_true_multiple("x", "y")
)

args = ap.parse_args()

print "args.x", args.x
print "args.y", args.y

是否有任何干净的方法可以用 argparse实现我想要的功能,而无需(0)在 parse_args()之后进行一些处理(第一个示例)或(2)编写自定义 argparse.Action(第二个示例)?

最佳答案

这很晚了,并不是您想要的那样,但是您可以尝试以下操作:

import argparse

myflags = ['x', 'y', 'z']

parser = argparse.ArgumentParser()
parser.add_argument('--flags', nargs="+", choices=myflags)
parser.add_argument('--all-flags', action='store_const', const=myflags, dest='flags')
args = parser.parse_args()
print(args)

然后调用 python myscript.py --flags x y输出
Namespace(flags=['x', 'y'])
并调用 python myscript.py --all-flags输出此
Namespace(flags=['x', 'y', 'z'])
但是您必须通过 'x' in args.flags而不是 args.x检查您的标志

关于Python `argparse` : Is there a clean way to add a flag that sets multiple flags (e. g。 `--all`“等同于 `--x --y`),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48834678/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com