有没有什么方法可以在Python中使用argparse强制执行精确区分大小写的标志匹配

问题描述 投票:0回答:1

我正在使用

argparse
库编写一个 Python 脚本来处理命令行参数。我想对特定标志强制执行严格且区分大小写的匹配。例如
--signup
,不允许任何其他变体、速记或不正确的拼写以及之后的任何值。

我尝试过使用自定义操作以及

nargs
参数,但我在实现预期结果方面面临挑战。这是我的代码的简化版本:

import argparse

class ValidateSignupAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None) -> None:
        if values != ['--signup']:
            parser.print_help()
            parser.exit(1) 
        setattr(namespace, self.dest, values)

def register_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("--signup", action=ValidateSignupAction, help="Initiate user signup process", required=True)
    register_args = parser.parse_args()
    return register_args

代码没有产生预期的结果。当我提供命令

python register.py --signup
python register.py --singup
时,它会打印两个命令行的帮助菜单。如果
True
python register.py --signup
之后没有任何值,我希望它返回
--signup

运行此脚本:

> python .\register.py --signup

打印:

usage: register.py [-h] --signup SIGNUP
register.py: error: argument --signup: expected one argument

有没有办法单独使用

--signup
来实现
argparse
标志的严格匹配级别?或者我应该考虑另一种方法?

任何建议或指导都会非常有帮助。预先感谢您的帮助。

补充说明:

  • 我尝试过使用

    choices
    参数,但它似乎不适用于我的用例。

  • 我的目标是强制执行精确的标志,没有速记或变化,即使在不同的字母情况下也是如此。

python command-line-arguments argparse flags
1个回答
0
投票

在 ipython 会话中测试:

In [128]: parser = argparse.ArgumentParser(allow_abbrev=False)
In [129]: parser.add_argument('--signup', action='store_true');

正确使用:

In [130]: parser.parse_args('--signup'.split())
Out[130]: Namespace(signup=True)

尝试添加字符串

In [131]: parser.parse_args('--signup foobar'.split())
usage: ipython [-h] [--signup]
ipython: error: unrecognized arguments: foobar
SystemExit: 2

尝试缩写:

In [132]: parser.parse_args('--sign'.split())
usage: ipython [-h] [--signup]
ipython: error: unrecognized arguments: --sign
SystemExit: 2
© www.soinside.com 2019 - 2024. All rights reserved.