[英]How to make argparse require argument name but remain optional with no prefix?
这就是我所拥有的——
parser = argparse.ArgumentParser()
parser.add_argument("--foo", required=True)
parser.add_argument("--bar", required=True)
args = parser.parse_args()
我不想有--
(或任何)前缀。 我可以简单地从--role
和--bar
名称中删除它(将它们重命名为role
和bar
),但这不允许我启用required
的参数。
我需要将add_arguments()
的required
参数设置为True
因为我想让参数名称在参数之前是强制性的。
我的目标是只制作这些(而不是其他语法) -
my_script.py foo=fooval bar=barval
my_script.py foo=fooval
my_script.py bar=barval
my_script.py bar=barval foo=fooval
my_script.py
有效的。
修改argparse
以处理其他格式在技术上是可行的,但需要付出巨大的努力。 构建自定义参数解析器更容易,尤其是在不需要很多特性的情况下。 但是,很容易预处理 arguments 并使用argparse
作为后端。
CLI arguments 的基础是sys.argv
。 例如,执行my_script.py bar=barval foo=fooval
将sys.argv
设置为['my_script.py', 'foo=12', 'bar=13']
。 这可以进行预处理以与argparse
一起使用,也可以完全手动处理。 其中哪一个更可取取决于需要多少argparse
功能。
要与argparse
一起使用,需要:
两者都可以通过使用prefix_chars=' '
来实现 - argparse
将其呈现为好像没有使用前缀,并且可以显式添加到 arguments。
import sys
import argparse
# parser with "invisible" prefix
parser = argparse.ArgumentParser(prefix_chars=' ')
parser.add_argument(" foo")
parser.add_argument(" bar")
# arguments with prefix added
argv = [
(' ' + item) if item[0] != ' ' else item
for item in sys.argv[1:]
]
# parse pre-processed arguments
args = parser.parse_args(argv)
根据是否必须同时支持位置 arguments 和标志,可能需要额外的预处理。
所需格式的简单解析器如下所示:
def parse_args(__argv__=None, **options):
"""Parse command line arguments"""
argv = sys.argv if __argv__ is None else __argv__
# split leading `my_script.py` executable from `foo=12`, ... arguments
executable, *arguments = argv
for argument in arguments:
# split each `name=value` pair
name, value = argument.split('=')
if name not in options:
raise ValueError(f"Unknown option: {name}")
options[name] = value
return options
这允许通过关键字指定预期的 arguments 及其默认值。
>>> argv = ['my_script.py', 'foo=12', 'bar=13']
>>> parse_args(argv, foo=None, bar='17', qux='12')
{'foo': '12', 'bar': '13', 'qux': '12'}
您只需要删除 required=True 选项。 当您将 required 设置为 true 时,它总是希望传入该参数。但如果没有它,它会在提供前缀的任何时候都期望一个值。
parser = argparse.ArgumentParser()
parser.add_argument("--foo")
parser.add_argument("--bar")
args = parser.parse_args()
注意:以上将允许my_script.py
没有任何 arguments。 Arguments 添加不带前缀将被视为默认需要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.