python - 使用 argparse 是否可以使先前定义的参数成为必需?
问题描述
我目前正在为几个相关脚本定义一组命令行参数,我希望它们对给定的上下文使用相同的参数,而不必复制/粘贴相应的部分。
在某些情况下,给定的参数是可选的,而在其他情况下它是必需的,因此我不能只设置一个通用参数解析器并在所有脚本中使用它。
一种方法是拥有一个create_argument_parser(flags)
基于给定标志创建解析器的函数。
另一种方法是首先定义一个参数解析器并根据我的需要对其进行修改。
有没有办法先定义一组参数,然后使它们成为可选/必需的?
解决方案
In [1]: import argparse
argparse
是用 Python 的类结构编写的,因此大多数命令都会生成可以检查的对象,并且可以进行有限程度的修改。但要明智地这样做。不要害怕编写自己的实用程序函数,如果有帮助的话,甚至可以编写类。
首先我们创建一个parser
对象:
In [2]: parser = argparse.ArgumentParser()
In [3]: parser
Out[3]: ArgumentParser(prog='ipython3', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)
add_argument
创建一个Action
对象,并将其放在parser._actions
列表中。它也返回它,我们可以保留该引用。
In [4]: a1 = parser.add_argument('foo')
In [5]: a1
Out[5]: _StoreAction(option_strings=[], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [6]: a1.required
Out[6]: True
In [7]: a2 = parser.add_argument('--bar')
In [8]: a2
Out[8]: _StoreAction(option_strings=['--bar'], dest='bar', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [9]: a2.required
Out[9]: False
In [10]: parser.print_help()
usage: ipython3 [-h] [--bar BAR] foo
positional arguments:
foo
optional arguments:
-h, --help show this help message and exit
--bar BAR
positionals
是,默认情况下required
。 optionals
不是,尽管我们可以指定该参数,创建一个“必需的可选”。
但既然required
是 的一个简单属性,Action
我们可以改变它:
In [11]: a2.required=True
In [12]: parser.print_usage()
usage: ipython3 [-h] --bar BAR foo
因此,您是使用实用程序脚本来创建解析器,还是进行这样的修改,都取决于您。这种修改路线可能更难维护/调试。parents
在使用该机制创建多个(子)解析器时,要格外小心进行属性更改。
推荐阅读
- containers - 服务容器未使用环境变量进行更新
- powerbi - 基于power bi中另一个表的过滤矩阵
- ajax - laravel modal 显示客户端信息
- jupyter-notebook - 在 Jupyter Notebook 中应用安全性的最佳方法是什么?
- python - 为字符串中的每个项目提供一个可变值?
- python - 如何在 PC 使用 python 关闭之前运行一个函数?
- asp.net-core - 如何将具有 IdentityServer 依赖项的 webapp 放入 Docker?
- user-interface - 以可视方式浏览 GCS 或 S3 存储桶(缩略图)
- powershell - 拒绝启动进程访问的 PowerShell 调用命令
- angular - 在返回值之前等待循环执行