首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态生成参数Clap

动态生成参数Clap
EN

Stack Overflow用户
提问于 2020-09-23 21:22:17
回答 1查看 652关注 0票数 5

我试图找出如何用Clap动态地从输入参数中生成参数。

我试图模仿的是下面的python代码:

代码语言:javascript
复制
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)

这样您就可以在命令中执行以下操作:

代码语言:javascript
复制
./foo.py -i foo bar baz --foo-bar foo --bar-bar bar --baz-bar bar

并由第一个参数动态生成附加参数。不确定在Clap中是否可以这样做,但我认为这是可能的,因为自述可以使用构建器模式动态生成arguments1。

因此,这是我天真的尝试,试图这样做。

代码语言:javascript
复制
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生成新的参数,然后再与之匹配。我对生锈很陌生,所以这是很有可能的,这是不可能的。

1https://github.com/clap-rs/clap

EN

回答 1

Stack Overflow用户

发布于 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,这对于测试是有用的.或者在这种情况下)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64036423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档