Fire:一行代码将任意Python函数变成CLI
Google开源的Fire库能自动将任意Python代码转换为命令行接口。请解释Fire的核心原理(反射+参数自省),对比它与argparse/click/typer的设计哲学差异,以及Fire适合与不适合的场景。
回答
我还是少年
Fire核心用法
# 最简单的Fire用法
import fire
def greet(name, greeting='Hello'):
print(f'{greeting}, {name}!')
if __name__ == '__main__':
fire.Fire(greet)
python greet.py World # Hello, World!
python greet.py World --greeting=Hi # Hi, World!
python greet.py --help # 自动生成帮助
类与子命令:
class Calculator:
def add(self, a, b):
return a + b
def multiply(self, a, b):
return a * b
if __name__ == '__main__':
fire.Fire(Calculator)
python calc.py add 3 4 # 7
python calc.py multiply 3 4 # 12
核心原理:
- 通过
inspect.signature获取函数/类的方法参数 - 将参数名自动转为CLI选项/参数
- 通过
type hints(如果有)自动推断参数类型 - 递归暴露类的所有方法为子命令
对比argparse/click/typer:
| 维度 | Fire | argpase/click/typer |
|---|---|---|
| 设计哲学 | 零配置、自动转换 | 显式定义CLI结构 |
| 学习成本 | 极低(一行代码) | 中等 |
| 可定制性 | 低 | 高 |
| 帮助信息美化 | 一般 | 好 |
| 参数校验 | 弱(依赖类型注解) | 强 |
适合场景:
- 快速将Python脚本变为CLI
- 内部工具/实验性CLI
- 数据科学脚本的快速接口
不适合场景:
- 面向用户的正式发布CLI
- 需要复杂帮助文档
- 需要精细参数校验和自定义行为