Python Fire 是一个由 Google 开发的开源库,用于从任何 Python 对象自动生成命令行界面(CLI)。它的核心优势是:简单、自动化、几乎零样板代码

如果你厌倦了为写一个简单的脚本而不得不编写 argparse 的大量模板代码,那么 Fire 绝对是你的得力助手。

为什么选择 Fire 而不是 Argparse?

argparse 是 Python 的标准库,功能强大,但不够简洁。Fire 通过自动化解决了这个问题。

场景:创建一个简单的问候脚本

使用 argparse 的传统方式:

你需要定义解析器、添加参数、解析参数,然后才能调用你的函数。

# greet_argparse.py
import argparse

def greet(name, greeting="Hello"):
  """生成一个问候语"""
  print(f"{greeting}, {name}!")

if __name__ == '__main__':
  parser = argparse.ArgumentParser(description="Greets someone.")
  parser.add_argument("name", type=str, help="The name to greet.")
  parser.add_argument("--greeting", type=str, default="Hello", help="The greeting to use.")
  
  args = parser.parse_args()
  
  greet(args.name, args.greeting)

使用 fire 的现代方式:

你只需要关注你的核心逻辑,然后把函数交给 fire.Fire()

# greet_fire.py
import fire

def greet(name, greeting="Hello"):
  """生成一个问候语"""
  print(f"{greeting}, {name}!")

if __name__ == '__main__':
  fire.Fire(greet)

Fire 会自动检查函数签名,将 name 识别为必需的位置参数,将 greeting 识别为可选的 --greeting 标志。命令行调用方式完全一样:

# 两种方式调用起来完全相同
$ python greet_fire.py World
Hello, World!

$ python greet_fire.py World --greeting "Good morning"
Good morning, World!

不仅仅是函数

Fire 的强大之处在于它可以处理任何 Python 对象,比如类。它会自动将类的方法映射为子命令。

# calculator.py
import fire
import time

class Calculator:
  """一个简单的计算器"""
  def add(self, a, b):
    """计算两数之和"""
    return a + b

  def subtract(self, a, b):
    """计算两数之差"""
    time.sleep(2) # 模拟耗时操作
    return a - b

if __name__ == '__main__':
  fire.Fire(Calculator)

执行子命令:

$ python calculator.py add 2 3
5

$ python calculator.py subtract 10 4
6

Fire 还会自动根据你的 docstrings 生成帮助文档。

$ python calculator.py -- --help

安装

pip install fire

总结

  • 使用 Python Fire: 当你需要为脚本、内部工具快速创建 CLI,或者想在开发调试时探索代码。
  • 使用 argparse: 当你构建需要分发给用户的正式应用,且需要对参数进行精细化控制时。

对于绝大多数日常脚本和内部工具来说,Fire 都能极大地提升你的开发效率。

参考

Google Fire - GitHub Repository