文章
argparse 知识点
Demo 1:最简起步——位置参数与帮助
import argparse
parser = argparse.ArgumentParser(description='一个简单的计算器')
parser.add_argument('number', type=int, help='一个整数')
args = parser.parse_args()
print(f'输入的数字是: {args.number}')
print(f'它的平方是: {args.number ** 2}')知识点:
argparse.ArgumentParser(description=...)创建解析器,description 会在--help中显示。add_argument('number')添加一个位置参数,必须提供。type=int自动将输入转为整数(默认是字符串)。help='...'提供参数说明。parse_args()解析命令行参数,返回一个命名空间对象,用args.number取值。
运行:
$ python demo1.py 5
输入的数字是: 5
它的平方是: 25
$ python demo1.py -h
usage: demo1.py [-h] number
一个简单的计算器
positional arguments:
number 一个整数
optional arguments:
-h, --help show this help message and exitDemo 2:可选参数、默认值、多值
import argparse
parser = argparse.ArgumentParser(description='文件复制工具')
parser.add_argument('-i', '--input', required=True, help='输入文件路径')
parser.add_argument('-o', '--output', default='out.txt', help='输出文件路径,默认 out.txt')
parser.add_argument('-n', '--count', type=int, default=1, help='复制份数,默认 1')
parser.add_argument('-v', '--verbose', action='store_true', help='是否显示详细信息')
args = parser.parse_args()
print(f'从 {args.input} 复制到 {args.output},共 {args.count} 份')
if args.verbose:
print('详细模式已开启')知识点:
-i, --input:同时提供短选项和长选项。required=True表示该可选参数必须提供。default='out.txt':不提供时使用默认值。type=int依然有效。action='store_true':-v不需要跟值,出现即为True,否则False(布尔标志)。- 命名空间里,长选项会作为属性名(
args.input),如果只有短选项则会用短选项名。
运行:
$ python demo2.py -i data.txt -n 3 -v
从 data.txt 复制到 out.txt,共 3 份
详细模式已开启Demo 3:互斥参数组
import argparse
parser = argparse.ArgumentParser(description='温度转换器')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('-c', '--celsius', type=float, help='摄氏温度')
group.add_argument('-f', '--fahrenheit', type=float, help='华氏温度')
args = parser.parse_args()
if args.celsius is not None:
f = args.celsius * 9/5 + 32
print(f'{args.celsius}°C = {f:.2f}°F')
else:
c = (args.fahrenheit - 32) * 5/9
print(f'{args.fahrenheit}°F = {c:.2f}°C')知识点:
add_mutually_exclusive_group(required=True)创建互斥组,组内选项不能同时出现,且必须提供至少一个(因为required=True)。- 互斥组常用于“二选一”或“多选一”的场景。
运行:
$ python demo3.py -c 100
100.0°C = 212.00°F
$ python demo3.py -f 32
32.0°F = 0.00°C
$ python demo3.py -c 100 -f 32
usage: demo3.py [-h] (-c CELSIUS | -f FAHRENHEIT)
demo3.py: error: argument -f/--fahrenheit: not allowed with argument -c/--celsiusDemo 4:选择列表、计数操作、自定义类型
import argparse
def level_type(value):
"""自定义类型:只接受特定范围或格式"""
ivalue = int(value)
if ivalue < 1 or ivalue > 5:
raise argparse.ArgumentTypeError(f'等级必须在 1-5 之间,得到 {value}')
return ivalue
parser = argparse.ArgumentParser(description='游戏设置')
parser.add_argument('--mode', choices=['easy', 'normal', 'hard'], default='normal',
help='游戏难度 (默认: normal)')
parser.add_argument('--level', type=level_type, default=1,
help='关卡等级 1-5 (默认: 1)')
parser.add_argument('--verbose', '-v', action='count', default=0,
help='增加详细程度,可多次使用 (如 -vv)')
args = parser.parse_args()
verbosity = ['静默', '普通', '详细', '调试']
print(f'模式: {args.mode}, 等级: {args.level}, 详细度: {verbosity[min(args.verbose, 3)]}')知识点:
choices=[...]:限制参数只能取列表中的值,输入其他值会报错并显示候选项。- 自定义类型函数:传入字符串,返回转换后的值或抛出
argparse.ArgumentTypeError。 action='count':适合-v -vv -vvv场景,每出现一次计数加 1,默认值为 0。
运行:
$ python demo4.py --mode hard --level 3 -vv
模式: hard, 等级: 3, 详细度: 调试
$ python demo4.py --level 6
usage: demo4.py [-h] [--mode {easy,normal,hard}] [--level LEVEL] [--verbose]
demo4.py: error: argument --level: 等级必须在 1-5 之间,得到 6Demo 5:子命令(subparsers)
import argparse
parser = argparse.ArgumentParser(description='Git 简化版')
subparsers = parser.add_subparsers(dest='command', help='可用子命令')
# 子命令 clone
parser_clone = subparsers.add_parser('clone', help='克隆仓库')
parser_clone.add_argument('url', help='仓库地址')
parser_clone.add_argument('--depth', type=int, help='浅克隆深度')
# 子命令 commit
parser_commit = subparsers.add_parser('commit', help='提交更改')
parser_commit.add_argument('-m', '--message', required=True, help='提交信息')
parser_commit.add_argument('-a', '--all', action='store_true', help='提交所有修改')
args = parser.parse_args()
if args.command == 'clone':
depth_info = f' (depth={args.depth})' if args.depth else ''
print(f'正在克隆 {args.url}{depth_info}')
elif args.command == 'commit':
all_files = '所有文件' if args.all else '已暂存文件'
print(f'提交 {all_files},信息: {args.message}')
else:
parser.print_help()知识点:
add_subparsers(dest='command')创建子命令容器,dest指定存放子命令名称的属性名。- 每个子命令通过
add_parser创建,像独立的解析器一样添加参数。 - 根据
args.command判断执行哪个子命令的逻辑。
运行:
$ python demo5.py clone https://example.com/repo.git --depth 1
正在克隆 https://example.com/repo.git (depth=1)
$ python demo5.py commit -m "修复bug" -a
提交 所有文件,信息: 修复bug
$ python demo5.py
usage: demo5.py [-h] {clone,commit} ...
demo5.py: error: too few arguments核心技能速记
| 技能点 | 关键词/方法 |
|---|---|
| 创建解析器 | ArgumentParser(description=...) |
| 位置参数 | add_argument('name') |
| 可选参数 | add_argument('-n', '--name') |
| 类型转换 | type=int/float 或自定义函数 |
| 默认值 | default=... |
| 必须参数 | required=True(对可选参数) |
| 布尔标志 | action='store_true' / store_false |
| 计数器 | action='count' |
| 限定取值 | choices=['a','b'] |
| 互斥选项 | add_mutually_exclusive_group() |
| 子命令 | add_subparsers() + add_parser() |
| 获取参数值 | args = parser.parse_args() → args.xxx |
| 自动帮助 | -h / --help 自动生成 |
- 不以
-或--开头 → 位置参数 → 默认必选 - 以
-或--开头 → 可选参数 → 默认可选,要变成必选就加required=True