本文最后更新于:2024-08-16T11:12:37+08:00
Fire的官方项目地址为:google/python-fire 。直接使用pip即可进行安装。本篇仅简要介绍了Fire的相关使用,更多细节可以参考The
Python Fire Guide
Fire的简单使用
CLI, Command Line
Interfaces,中文为命令行程序,它的核心实际上就在于参数的解析以及逻辑的调用。一种常用而简单的实现方式是通过argparse 来解析命令行参数,然后在main函数的逻辑中进行相应的调用。而Fire将这些步骤进一步简化和封装,使得我们直接通过包装函数或者对象,就能够构建一个简单的命令行程序。
方法包装
假设我们的核心逻辑是一个方法,通过Fire
对象包装之后,我们就可以通过命令行传入参数的方式来执行相应的逻辑。
1 2 3 4 5 6 7 8 9 10 import firedef 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 python fire_test.py --name=eve --age=26 python fire_test.py --help
当然我们也可以选择直接调用fire.Fire()
而不传入函数,这将会暴露程序的完整内容:
1 2 3 4 5 6 7 import firedef hello (name ): return 'Hello {name}!' .format (name=name)if __name__ == '__main__' : fire.Fire()
此时可以通过如下方式进行调用:
1 python fire_test.py hello eve
如果我们想要控制暴露哪些方法,那么可以通过一个dict来进行控制,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 import firedef add (x, y ): return x + ydef multiply (x, y ): return x * yif __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 import fireclass 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 / bif __name__ == '__main__' : fire.Fire(Calculator)
那么在运行的时候,我们就可以通过命令行来选择要调用这个对象的哪些方法,并且可以按照顺序,或者指定名称来传入相应的参数:
1 2 3 python fire-test.py add 5 10 python fire-test.py subtract --b=10 --a=5 python fire-test.py division 10 --b=2
在调用该类的任何一个相关方法时,我们都可以传入构造方法中的参数,例如这里的offset。
1 python fire-test.py add 5 10 --offset=-2
类似项目
一些类似的项目:
tyro:https://github.com/brentyi/tyro