如何在Python argparse中传递以'-'开头的参数给选项?
问题:如何让argparse接收以“-”开头的参数值?
我想要将以“-”开头的参数传递给argparse选项,示例代码如下:
import argparse parser = argparse.ArgumentParser() parser.add_argument("-a") print(parser.parse_args(['-a', 'hi'])) print(parser.parse_args(['-a', '-hi']))
当前输出为:
Namespace(a='hi') usage: problem.py [-h] [-a A] problem.py: error: argument -a: expected one argument
而我期望的输出是:
Namespace(a='hi') Namespace(a='-hi')
我查阅了帮助文档的15.4.4.3节《包含'-'的参数》,但该部分似乎仅支持负数。文档还建议使用"--",但这不符合我的使用场景——因为"--"之后的所有内容都不会被当作参数解析。我希望"-a"仅接收一个参数,后续的其他参数仍能正常解析。目前发现在参数前加空格可行(如print parser.parse_args(['-a', ' -hi'])),但有没有无需用户添加空格的实现方式?
解决方案
这个问题我之前也碰到过,argparse默认会把以-开头的内容当作新的命令行选项,所以才会触发报错。想要实现你要的效果,有两个靠谱的方法:
1. 自定义解析动作(推荐,无需用户额外操作)
我们可以通过自定义argparse.Action子类,强制让argparse把后续的参数直接赋值给目标选项,不管它是否以-开头。这样用户完全不需要改变输入习惯,直接像正常传递参数一样操作即可。
示例代码:
import argparse class StoreDashValueAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): # 直接将传入的值赋值给对应的参数,忽略其是否以'-'开头 setattr(namespace, self.dest, values) # 使用自定义动作定义参数 parser = argparse.ArgumentParser() parser.add_argument("-a", action=StoreDashValueAction) # 可以添加其他参数,后续参数仍能正常解析 parser.add_argument("-b") # 测试 print(parser.parse_args(['-a', 'hi'])) print(parser.parse_args(['-a', '-hi'])) print(parser.parse_args(['-a', '-hi', '-b', 'hello']))
输出结果:
Namespace(a='hi', b=None) Namespace(a='-hi', b=None) Namespace(a='-hi', b='hello')
2. 让用户用=连接选项与参数值(无需修改代码)
如果允许用户稍微调整输入方式,也可以让用户通过=来连接选项和参数值,这样argparse会自动把=后面的内容当作参数值,即使它以-开头。
示例代码用你原来的定义即可:
import argparse parser = argparse.ArgumentParser() parser.add_argument("-a") parser.add_argument("-b") # 测试使用=连接的方式 print(parser.parse_args(['-a=-hi', '-b', 'test']))
输出结果:
Namespace(a='-hi', b='test')
这种方法不需要修改任何解析逻辑,但需要用户了解这个输入规则。
内容的提问来源于stack exchange,提问作者Zvika
相关产品推荐
相关产品推荐

