Fire: 从Python对象快速生成CLI

Fire的官方项目地址为:google/python-fire。直接使用pip即可进行安装。本篇仅简要介绍了Fire的相关使用,更多细节可以参考The Python Fire Guide

1
pip install fire

Fire的简单使用

CLI, Command Line Interfaces,中文为命令行程序,它的核心实际上就在于参数的解析以及逻辑的调用。一种常用而简单的实现方式是通过argparse来解析命令行参数,然后在main函数的逻辑中进行相应的调用。而Fire将这些步骤进一步简化和封装,使得我们直接通过包装函数或者对象,就能够构建一个简单的命令行程序。

方法包装

假设我们的核心逻辑是一个方法,通过Fire对象包装之后,我们就可以通过命令行传入参数的方式来执行相应的逻辑。

1
2
3
4
5
6
7
8
9
10
# fire_test.py
import fire


def core_func(name, age=18):
return f'name: {name}, age: {age}'


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

使用命令行执行:

1
2
3
python fire_test.py --name=eve  # name: eve, age: 18
python fire_test.py --name=eve --age=26 # name: eve, age: 26
python fire_test.py --help # show usage information

当然我们也可以选择直接调用fire.Fire()而不传入函数,这将会暴露程序的完整内容:

1
2
3
4
5
6
7
import fire

def hello(name):
return 'Hello {name}!'.format(name=name)

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

此时可以通过如下方式进行调用:

1
python fire_test.py hello eve  # Hello eve!

如果我们想要控制暴露哪些方法,那么可以通过一个dict来进行控制,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
import fire

def add(x, y):
return x + y

def multiply(x, y):
return x * y

if __name__ == '__main__':
fire.Fire({
'add': add,
'multiply': multiply,
})

类包装

假设我们的核心逻辑是一个类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# fire_test.py
import fire


class Calculator:
def __init__(self, offset=1):
self.offset=offset

def add(self, a, b):
return a + b

def subtract(self, a, b):
return a - b

def multiplication(self, a, b):
return a * b

def division(self, a, b):
return a / b


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

那么在运行的时候,我们就可以通过命令行来选择要调用这个对象的哪些方法,并且可以按照顺序,或者指定名称来传入相应的参数:

1
2
3
python fire-test.py add 5 10  # 15
python fire-test.py subtract --b=10 --a=5 # -5
python fire-test.py division 10 --b=2 # 5.0

在调用该类的任何一个相关方法时,我们都可以传入构造方法中的参数,例如这里的offset。

1
python fire-test.py add 5 10 --offset=-2

类似项目

一些类似的项目:

  • tyro:https://github.com/brentyi/tyro

Fire: 从Python对象快速生成CLI
http://example.com/2024/04/26/Fire-从Python对象快速生成CLI/
作者
EverNorif
发布于
2024年4月26日
许可协议