click vs argparse vs typer:Python命令行工具框架对比
Python有多个命令行工具框架。请对比标准库argparse、三方库click和现代化框架typer(基于type hints)的设计哲学、代码简洁性、子命令支持和参数校验能力,给出不同场景的选择建议。
回答
我还是少年
1. argparse(标准库)
import argparse
parser = argparse.ArgumentParser(description='处理文件')
parser.add_argument('input', help='输入文件')
parser.add_argument('--output', '-o', default='output.txt', help='输出文件')
parser.add_argument('--verbose', '-v', action='store_true', help='详细输出')
args = parser.parse_args()
优点:标准库、零依赖 缺点:代码冗长、子命令配置繁琐、无类型自动转换(需type参数)
2. click(装饰器风格)
import click
@click.command()
@click.argument('input')
@click.option('--output', '-o', default='output.txt')
@click.option('--verbose', '-v', is_flag=True)
def process(input, output, verbose):
click.echo(f'处理 {input} -> {output}')
if __name__ == '__main__':
process()
优点:
- 装饰器简洁、直观
- 自动生成帮助文档
- 子命令支持好(
@click.group()) - 内置类型转换、参数校验
缺点:装饰器调试不如函数调用直观
3. typer(基于类型注解,推荐)
import typer
app = typer.Typer()
@app.command()
def process(
input: str = typer.Argument(..., help='输入文件'),
output: str = typer.Option('output.txt', '--output', '-o'),
verbose: bool = typer.Option(False, '--verbose', '-v')
):
typer.echo(f'处理 {input} -> {output}')
if __name__ == '__main__':
app()
优点:
- 基于类型注解,自动类型推断
- 自动生成--help(
- 内置自动补全支持
- 支持异步命令(
async def) - 基于click,兼容click生态
对比
| 维度 | argparse | click | typer |
|---|---|---|---|
| 代码量 | 多 | 中 | 少 |
| 类型推断 | ❌ | 需显式 | ✅ 自动 |
| 子命令 | 繁琐 | 好 | 好 |
| 自动帮助 | ✅ | ✅ | ✅ |
| 依赖 | 无 | 需安装 | 需安装 |
选择建议:
- 简单脚本:argparse
- 成熟CLI工具:click
- 新项目推荐:typer(简洁+类型安全)