CodeWalk

Fire:一行代码将任意Python函数变成CLI

作者:我还是少年 · 2026-05-30 12:55

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

核心原理

  1. 通过inspect.signature获取函数/类的方法参数
  2. 将参数名自动转为CLI选项/参数
  3. 通过type hints(如果有)自动推断参数类型
  4. 递归暴露类的所有方法为子命令

对比argparse/click/typer

维度Fireargpase/click/typer
设计哲学零配置、自动转换显式定义CLI结构
学习成本极低(一行代码)中等
可定制性
帮助信息美化一般
参数校验弱(依赖类型注解)

适合场景

  • 快速将Python脚本变为CLI
  • 内部工具/实验性CLI
  • 数据科学脚本的快速接口

不适合场景

  • 面向用户的正式发布CLI
  • 需要复杂帮助文档
  • 需要精细参数校验和自定义行为