Sig*_*and 7 command-line-arguments rust clap
我正在尝试弄清楚如何使用 Clap 从输入参数动态生成参数。
\n我试图用 Clap 模拟以下 python 代码:
\nparser = argparse.ArgumentParser()\nparser.add_argument("-i", type=str, nargs="*")\n(input_args, additional_args) = parser.parse_known_args()\nfor arg in input_args:\n parser.add_argument(f\'--{arg}-bar\', required=true, type=str)\n\nadditional_config = parser.parse_args(additional_args)\nRun Code Online (Sandbox Code Playgroud)\n这样您就可以在命令中执行以下操作:
\n./foo.py -i foo bar baz --foo-bar foo --bar-bar bar --baz-bar bar\nRun Code Online (Sandbox Code Playgroud)\n并从第一个参数动态生成附加参数。不确定是否可以在 Clap 中执行,但我认为这是可能的,因为自述文件指出您可以使用构建器模式动态生成参数 [1]。
\n所以这是我尝试这样做的天真的尝试。
\nuse clap::{Arg, App};\n\nfn main()\xc2\xa0{\n let mut app = App::new("foo")\n .arg(Arg::new("input")\n .short(\'i\')\n .value_name("INPUT")\n .multiple(true)\n .required(true));\n let matches = app.get_matches_mut();\n let input: Vec<_> = matches.values_of("input").unwrap().collect()\n for i in input {\n app.arg(Arg::new(&*format!("{}-bar", i)).required(true))\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n这显然不会让编译器在你的一生中对你尖叫!format,app.arg我最感兴趣的是解决如何生成新的参数,app然后可以再次匹配。我对 Rust 还很陌生,所以 Clap 很可能无法做到这一点。
[1]\xc2\xa0https://github.com/clap-rs/clap
\n我认为这是可能的,因为自述文件指出您可以使用构建器模式动态生成参数[1]。
动态生成参数意味着,您可以.arg使用运行时值并且它会正常工作(也就是说整个 CLI 不需要在编译时完全定义,这种区别在 Python 中不存在,因为一切都是在运行时完成的) 。
当您传递未知参数然后重新解析它们时,您在这里所做的事情明显更加复杂(并且专业且奇怪) 。
现在首先,您实际上无法App在 clap 中重用:它的大多数方法(非常包括get_matches)都会获取self并因此“消耗”应用程序并返回其他内容,无论是原始应用程序还是结果。虽然我猜你可以clone在你之前使用原始应用程序。get_matches
但我认为这在这里没有用:虽然我没有尝试过,但应该可以做你想做的事情TrailingVarArg:这会将所有尾随参数收集到单个位置参数切片中(你可能AllowLeadingHyphen也需要),然后你可以使用动态生成的参数创建第二个 App参数,以便解析该参数子集(get_matches_from将从迭代器而不是 env args 进行解析,这对于测试...或对于这种确切的情况很有用)。
| 归档时间: |
|
| 查看次数: |
1295 次 |
| 最近记录: |