argparse:列表中的标志

如何解决argparse:列表中的标志

我在python中有一个方法可以解析CI库所需的所有api请求。

实际上,此方法的整个配置都存储在yaml文件中。

示例:

ci:
  sonar:
    name: "python_module.ci.sonar_api"
  env:
    name: "Sonar"
    required:
      AUTH_TOKEN: ["--token","--t"]
      HOST_URL: ["--url","--host","--U"]
    optioal:
      TAGS: ["--tags","--T"]
      ...
...

我也将这种方法与pythons脚本一起使用以生成报告或由jenkins调用,示例将与这些脚本之一相对应

我有这段代码来构建argparse(args_dict参数是必需值和可选值的附加,而project_name是任何字符串):

def parse(project_name,args_dict):
    parse_args = argparse.ArgumentParser(
        description='Request to the '+project_name+' api service.'
    )
    for _key in args_dict:
        parse_args.add_argument(
            str(','.join(args_dict[_key])),action="store",dest=_key,help=project_name+" "+_key+" ENV::"+project_name.upper()+"_"+_key,default=os.environ.get(project_name.upper()+"_"+_key,None)
        )
    return parse_args

这些脚本中任何一个的执行结果是:

./sonar_report  -h
sonar_report | 2020-10-31 20:34:18.194862 |  START    | Starting process
usage: sonar_report [-h] [--token,--t AUTH_TOKEN] [--url,--host,--U HOST_URL] [--tags,--T
TAGS]

Request to the Sonar api service.

optional arguments:
  -h,--help            show this help message and exit
  --token,--t AUTH_TOKEN
                        Sonar AUTH_TOKEN ENV::SONAR_AUTH_TOKEN
  --url,--U HOST_URL
                        Sonar HOST_URL ENV::SONAR_HOST_URL
  --tags,--T TAGS       Sonar TAGS ENV::SONAR_TAGS

如果我使用第一个定义的标志执行此脚本,则它可以工作,但是问题是当我对任何参数使用另一个标志时:

usage: sonar_report [-h] [--token,--T
TAGS]
sonar_report: error: unrecognized arguments: --T test

有人知道如何将标志作为列表传递吗?

编辑:

我排除了忽略未知参数的错误,并打印了参数的值:

def validate(argument_parser,args_dict,ignore_unkNowns=None):
    try:
        if ignore_unkNowns is None:
            params = vars(argument_parser.parse_args())
        else:
            _params,_unkNowns = argument_parser.parse_kNown_args()
            params = vars(_params)
    except Exception:
        print(f"###ERROR## Trying to parse dictionary's arguments: " +
              f"{str(Exception)}")
        argument_parser.print_help()
        print()
        return None
    print(_params)
    print(_unkNowns)
    .........

结果是:

Namespace(AUTH_TOKEN='***************************',HOST_URL='***************************',TAGS=None)
['--T','test']

主要内容如下:

 params: project_name,env,required_args=None,ignore_unkNowns=True
 return: (validate(parse(project_name,env),required_args,ignore_unkNowns))

解决方法

定义一个简单的字典:

In [197]: dd = {'foo':['-f','--foo']}
In [198]: key='foo'


In [206]: import argparse
In [207]: parser=argparse.ArgumentParser()

使用您的str/join定义参数。我让argparse设置dest来使操作更清晰:

In [208]: parser.add_argument(str(','.join(dd[key])),help=f'help for {key}')
Out[208]: _StoreAction(option_strings=['-f,--foo'],dest='f,__foo',nargs=None,const=None,default=None,type=None,choices=None,help='help for foo',metavar=None)
In [209]: parser.print_help()
usage: ipython3 [-h] [-f,--foo F,__FOO]

optional arguments:
  -h,--help          show this help message and exit
  -f,__FOO  help for foo
In [210]: parser.parse_args([])
Out[210]: Namespace(**{'f,__foo': None})

请注意,它期望的标志是'-f,--foo',而不是两个字符串的组合。

如果我改用**dd[key],则将字符串列表解压缩:

In [211]: parser=argparse.ArgumentParser()
In [212]: parser.add_argument(*dd[key],help=f'help for {key}')
Out[212]: _StoreAction(option_strings=['-f','--foo'],dest='foo',metavar=None)
In [213]: parser.print_help()
usage: ipython3 [-h] [-f FOO]

optional arguments:
  -h,--help         show this help message and exit
  -f FOO,--foo FOO  help for foo
In [214]: parser.parse_args([])
Out[214]: Namespace(foo=None)
In [215]: parser.parse_args(['--foo','foobar'])
Out[215]: Namespace(foo='foobar')

现在目标是foo,'-f'和'--foo'都起作用。

add_argument返回一个Action对象。通常,此返回将被忽略,但是在此交互式会话中将其显示,从而使我们更清楚地了解正在发生的事情。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?