Python argparse 如何实现必须互斥的两个参数(mutex group)
技术百科
冷炫風刃
发布时间:2026-01-25
浏览: 次 argparse中用add_mutually_exclusive_group(required=True)创建必须二选一的互斥参数组,否则默认可全不提供;组内参数类型宜一致,required必须设在组层级而非单个参数;子命令中需在对应子解析器上定义该组。
argparse 里怎么创建互斥参数组
用 add_mutually_exclusive_group(),它返回一个组对象,后续所有加到这个组里的参数都会自动互斥——命令行里不能同时出现,否则报错。
注意:这个组默认是可选的(即所有参数都可以不提供),如果希望“必须二选一”,得额外设 required=True。
示例:
import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('--verbose', action='store_true')
group.add_argument('--quiet', action='store_true')
args = parser.parse_args()
这样运行 python script.py --verbose --quiet 会直接报错:error: argument --quiet: not allowed with argument --verbose;而只运行 python script.py 也会报错,因为没提供任一参数(required=True 起效)。
为什么 --verbose 和 --quiet 同时不加会报错
关键在 required=True。互斥组默认不要求提供任何参数,加上这个参数后,才强制用户必须显式指定其中**且仅一个**。
常见误操作:
- 漏写
required=True,结果用户啥都不传也不报错,逻辑跑飞 - 把
required=True错加在单个add_argument()上,这没用——互斥约束只在组层级生效 - 混用
action='store_true'和带值参数(如type=str),虽然语法允许,但语义容易混乱,建议类型一致
能加多个参数到同一个互斥组吗
可以,但要小心语义和用户体验。
比如三个选项:--fast、--slow、--custom N,全塞进一个互斥组没问题,argparse 会确保最多一个被使用。
但要注意:
-
--custom如果带nargs=1或type=int,和其他布尔型参数放一起,help 输出会略显不统一 - 错误提示信息固定为“not allowed with argument X”,不会说明“三选一”,用户可能困惑
- argparse 不支持“至少选一个”或“恰好选两个”这类更复杂的逻辑,超出互斥组能力范围
和子命令(subparsers)混用时要注意什么
互斥组必须定义在最终解析上下文里。如果用了 add_subparsers(),互斥组得加在子解析器上,而不是主 parser。
例如:
sub_a = subparsers.add_parser('build')
group = sub_a.add_mu
tually_exclusive_group(required=True)
group.add_argument('--debug', action='store_true')
group.add_argument('--release', action='store_true')
如果错加在主 parser 上,那无论执行哪个子命令,都会强制要求传互斥参数,通常不是你想要的。
另一个坑:子命令本身有 required=True(Python 3.7+ 默认行为),但互斥组的 required 是独立控制的,别以为开了子命令就自动解决参数必填问题。
# 也不
# 开了
# 多个
# 也会
# 最多
# 但要
# python
# Error
# 对象
# int
# 报错
# 为什么
# red
# 布尔型
# 器上
# 值参数
# 互斥
# 加在
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Python如何创建带属性的XML节点
- Windows10如何删除Windows.old_
- 如何使用Golang实现基本类型比较_Golang
- Windows Defender扫描失败怎么办_安
- MAC怎么用连续互通相机里的“桌上视角”_MAC在
- Windows10如何删除恢复分区_Win10 D
- Win11怎么更改系统语言为中文_Windows1
- ACF 教程:如何正确更新嵌套在多层 Group
- 一文教你快速开通网站LOGO图
- c# 在高并发下使用反射发射(Reflection
- Win11怎么关闭定位服务 Win11禁止应用获取
- Win10闹钟铃声怎么自定义 Win10闹钟自定义
- 如何用正则表达式精确匹配“start”到“end”
- Windows10如何更改系统字体大小_Win10
- php8.4如何实现队列任务_php8.4redi
- Win11 explorer.exe频繁崩溃_修复
- Mac如何开启夜览模式_Mac护眼模式设置与定时
- Win11怎么更改管理员名字 Win11修改账户名
- LINUX如何查看文件类型_Linux中file命
- Windows10电脑怎么设置防火墙出站规则_Wi
- Win11怎么修改DNS服务器 Win11设置DN
- 如何在Windows上设置闹钟和计时器_系统自带的
- Windows系统被恶意软件破坏后的恢复策略_错误
- Windows怎样拦截QQ浏览器广告_Window
- Windows笔记本无法进入睡眠模式怎么办?(电源
- php8.4如何配置ssl证书_php8.4htt
- mac怎么打开终端_MAC终端Terminal使用
- Win11怎么关闭专注助手 Win11关闭免打扰模
- PythonFastAPI项目实战教程_API接口
- 如何更改Windows资源管理器的默认启动位置?(
- Golang如何遍历目录文件_Golang fil
- 如何使用Golang搭建Web开发环境_快速启动H
- Windows 10怎么把任务栏放在屏幕上方_Wi
- c++中explicit(bool)的用法 c++
- Linux如何使用grep搜索文件内容_Linux
- PHP的Workerman对架构扩展有啥帮助_应用
- Win11无法安装软件怎么办_Win11解除应用安
- Win11任务栏怎么调到左边_Win11开始菜单居
- Mac的“预览”如何合并多个PDF_Mac文件处理
- Mac的Time Machine怎么用_Mac系统
- php下载安装后swoole扩展怎么安装_异步框架
- Win11怎么设置单手模式_Win11触控键盘布局
- Win11怎么设置夜间模式_Windows11显示
- c# 服务器GC和工作站GC的区别和设置
- 如何使用Golang实现微服务状态监控_Golan
- Win11怎么更改系统语言_Win11中文语言包下
- Django密码修改后会话失效的解决方案
- 如何使用 Selenium 正确获取篮球参考网站球
- Win10电脑C盘红了怎么清理_Windows10
- 如何使用Golang实现容器安全扫描_Golang


QQ客服