我试图找出如何用Clap动态地从输入参数中生成参数。
我试图模仿的是下面的python代码:
parser = argparse.ArgumentParser()
parser.add_argument("-i", type=str, nargs="*")
(input_args, additional_args) = parser.parse_known_args()
for arg in input_args:
parser.add_argument(f'--{arg}-bar', required=true, type=str)
additional_config = parser.parse_args(additional_args)这样您就可以在命令中执行以下操作:
./foo.py -i foo bar baz --foo-bar foo --bar-bar bar --baz-bar bar并由第一个参数动态生成附加参数。不确定在Clap中是否可以这样做,但我认为这是可能的,因为自述可以使用构建器模式动态生成arguments1。
因此,这是我天真的尝试,试图这样做。
use clap::{Arg, App};
fn main() {
let mut app = App::new("foo")
.arg(Arg::new("input")
.short('i')
.value_name("INPUT")
.multiple(true)
.required(true));
let matches = app.get_matches_mut();
let input: Vec<_> = matches.values_of("input").unwrap().collect()
for i in input {
app.arg(Arg::new(&*format!("{}-bar", i)).required(true))
}
}这显然不会让编译器在!format生命期和app.arg期间对您大喊大叫,我最感兴趣的是如何为app生成新的参数,然后再与之匹配。我对生锈很陌生,所以这是很有可能的,这是不可能的。
发布于 2020-09-24 05:55:44
我认为这可能是可能的,因为自述可以使用构建器模式动态生成arguments1。
动态生成参数意味着,您可以使用运行时值进行.arg,并且它会很好地工作(也就是整个CLI不需要在编译时完全定义,这种区别在Python中并不存在,因为一切都是在运行时完成的)。
您在这里所做的事情要复杂得多(而且是专门的和奇怪的),因为您正在传递未知的参数,然后重新解析它们。
首先,您实际上不能在clap中重用App:它的大多数方法(非常包括get_matches)都采用self,因此“消费”了应用程序,并返回了其他东西,要么是原始的应用程序,要么是结果。虽然你可以在你的clone之前get_matches它,我想。
但是我认为这在这里没有用:虽然我还没有尝试使用TrailingVarArg来做你想做的事情:这将把所有尾随参数收集到一个位置arg片(you will probably need AllowLeadingHyphen as well)中,然后您可以创建一个带有动态生成参数的第二个App,以便解析这组参数(get_matches_from will parse from an iterator rather than the env args,这对于测试是有用的.或者在这种情况下)。
https://stackoverflow.com/questions/64036423
复制相似问题