繁体   English   中英

如何使 argparse 需要参数名称但仍然是可选的,没有前缀?

[英]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名称中删除它(将它们重命名为rolebar ),但这不允许我启用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=foovalsys.argv设置为['my_script.py', 'foo=12', 'bar=13'] 这可以进行预处理以与argparse一起使用,也可以完全手动处理。 其中哪一个更可取取决于需要多少argparse功能。


要与argparse一起使用,需要:

  • 模拟帮助信息,
  • 调整提供的 arguments。

两者都可以通过使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM