大数据

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 exit

Demo 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/--celsius

Demo 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 之间,得到 6

Demo 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