我正在使用
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
参数,但它似乎不适用于我的用例。
我的目标是强制执行精确的标志,没有速记或变化,即使在不同的字母情况下也是如此。
在 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