argparse允许任意标志的使用。

3

有没有一种方法可以让argparse接受任意标志?

例如,我有一个覆盖git push的包装器称为gitter

我不想指定所有可用于git push的标志,因为有很多。

但是,我仍然希望能够执行类似以下的操作

gitter --all --no-verify

有没有一种方法让argparse接受任意标志,并将这些标志传递给git push

如果我执行gitter --fake-flag,我会立即收到错误,而没有解析出标志的机会。

2个回答

6
你可以使用 parse_known_args 将未被识别的标志保存在列表中。
p = ArgumentParser()
p.add_argument("--foo")
args, remaining = p.parse_known_args("--foo 5 --bar --baz".split())

# args.foo == 5
# remaining = ["--bar", "--baz"]

谢谢您的回复。我猜想我应该用从ArgumentParser()中获取的实际标志来替换'"--foo 5 --bar --baz".split()',对吗? - Andy
是的。parse_known_args 不需要您定义 任何 标志; 命令行上未定义的任何内容都会按顺序放在 parse_known_args 返回的元组的第二个元素中。已识别的标志将被解析、删除并用于设置第一个元素的属性。 - chepner
感谢您再次回复我。您是否知道如何使用ArgumentParser()生成"--foo 5 --bar --baz".split()?在尝试了一番后,我尝试了parse_args(),但它返回一个无法转换为列表对象的namespace对象。 - Andy
parse_argsparse_known_args都只需要一个单词列表(默认为sys.argv[1:])作为参数。我使用split作为一种快速而简单的方法,从字符串生成一个列表。 - chepner

0
为什么不使用bash脚本代替Python来处理gitter呢?类似这样的脚本:
#!/bin/bash
git push --alwaysArg "$@"

运行时:

gitter --all --no-verify

生成的命令将是:

git push --alwaysArg --all --no-verify

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接