argparse
argparse.add_argument 完全指南
🧱 基础篇:命令行参数解析入门
1. 模块初始化
import argparse# 创建参数解析器(所有操作的基础容器)
parser = argparse.ArgumentParser(
prog='MyApp', # 程序名称(默认从sys.argv[0]获取)
description='数据处理器',
epilog='示例: python app.py input.txt --mode fast'
)
2. 参数类型解析
位置参数(Positional Arguments)
# 必须按顺序提供的参数(无前缀)
parser.add_argument(
'input_file', # 参数名称
type=str, # 自动类型转换
help='输入文件路径'
)
▶ 调用方式:
python app.py data.csv # data.csv 赋值给 args.input_file
可选参数(Optional Arguments)
# 通过 - 或 -- 标识的参数(顺序无关)
parser.add_argument(
'-m', '--mode', # 短参数 + 长参数
choices=['fast', 'slow'],
default='fast',
help='运行模式(默认: fast)'
)
▶ 调用方式:
python app.py data.csv --mode slow
🔧 核心参数详解
参数 | 作用描述 | 高级特性说明 |
---|---|---|
dest | 结果字典中的属性名 | 默认自动生成(如 --mode → mode) |
type | 类型强制转换 | 支持自定义函数(见进阶篇) |
nargs | 参数值的数量规则 | ?*+数字 |
const | 与action配合使用的常量值 | 常用于标志型参数 |
metavar | 帮助文档中显示的参数值占位符 | 默认用大写参数名(如 MODE) |
代码示例:复杂参数定义
parser.add_argument(
'--range',
type=float,
nargs=2, # 必须提供两个值
metavar=('MIN', 'MAX'),
help='取值范围(示例: --range 0.5 2.0)'
)
▶ 调用结果:
args.range → [0.5, 2.0]
🚀 进阶篇:高级应用场景
场景1:动态参数处理
自定义类型验证
def valid_percentage(value):v = float(value)if not (0 <= v <= 1):raise argparse.ArgumentTypeError('必须在0-1之间')return vparser.add_argument(
'--threshold',
type=valid_percentage, # 使用自定义验证函数
default=0.5
)
自定义 Action 类
class UpperCaseAction(argparse.Action):def call(self, parser, namespace, values, option_string=None):setattr(namespace, self.dest, values.upper())parser.add_argument(
'--text',
action=UpperCaseAction, # 自动转为大写
type=str
)
场景2:复合参数结构
子命令系统(类似git)
subparsers = parser.add_subparsers(title='commands', dest='command')# 创建子解析器
parser_train = subparsers.add_parser('train', help='训练模式')
parser_train.add_argument('--epochs', type=int)parser_test = subparsers.add_parser('test', help='测试模式')
parser_test.add_argument('--batch-size')
▶ 调用方式:
python app.py train --epochs 50
python app.py test --batch-size 32
场景3: 处理路径参数
# 使用Path对象(Python 3.6+)
from pathlib import Path
parser.add_argument('--dir', type=Path)
⚠️ 避坑指南
# 错误:短参数重复定义
parser.add_argument('-v', ...)
parser.add_argument('-v', ...) # 触发ArgumentError
# 布尔参数的正确姿势
parser.add_argument("--verbose", action="store_true", help="显示详细信息")
# 推荐写法(互斥组)
group = parser.add_mutually_exclusive_group()
group.add_argument('--enable', action='store_true')
group.add_argument('--disable', action='store_false', dest='enable')
转义字符:
- 若参数值包含 *、# 等符号,需在代码中用 \ 转义。
- 示例:parser.add_argument(“–filter”, help=“过滤模式(如 *.txt)”)。
参数顺序:
- 使用 nargs=argparse.REMAINDER 时,必须将其作为最后一个参数定义,否则后续参数无法解析。
💡 最佳实践:使用 argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) 可在帮助信息中显示默认值