You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:38:49