1. 不带初始化参数的类
其实 Fire 可以接收一切 Python 对象,那我们使用一个类来看下具体使用方法:
import fire
from typing import Text
class Calculator(object):
"""A simple calculator class."""
@staticmethod
def double(number: int) -> int:
"""将给定数值乘以 2 后返回
:param number: 数值
:return: int
"""
return 2 * number
if __name__ == '__main__':
fire.Fire(Calculator)
也可以将类实例化之后,传给 Fire:
calculator = Calculator()
fire.Fire(calculator)
在终端中使用如下命令进行操作:
$ python calculator.py double 10
20
$ python calculator.py double --number=15
30
2. 带有初始化参数的类
如果我们的类带有初始化参数,那么我们如何调用类方法,以及如何传递参数初始值给了类:
import fire
class BrokenCalculator(object):
def __init__(self, offset: int = 1):
self._offset = offset
def add(self, x: int, y: int) -> int:
return x + y + self._offset
def multiply(self, x: int, y: int) -> int:
return x * y + self._offset
if __name__ == '__main__':
fire.Fire(BrokenCalculator)
这里的BrokenCalculator
类有一个初始化offset
变量(默认为 1),我们采用如下方式来进行传参:
$ python example.py multiply 10 20 --offset=0
200
如果类的初始化参数变量名与函数变量名一致的,在命令行中调用需要采用如下方式(当然,最好的方式还是不一样)。:
import fire
class BrokenCalculator(object):
def __init__(self, x: int = 1):
self._offset = x
def add(self, x: int, y: int) -> int:
return x + y + self._offset
def multiply(self, x: int, y: int) -> int:
return x * y + self._offset
if __name__ == '__main__':
fire.Fire(BrokenCalculator)
在终端中正确的调用方式:
$ python helloFire.py add 10 20 --x=5
35
$ python helloFire.py add 10 --y=20 --x=5
35
$ python helloFire.py add --x=10 --y=20 --x=5 # 这种方式是错误的
再来看一下示例,帮助我们理解:
import fire
class Building(object):
def __init__(self, name, stories=1):
self.name = name
self.stories = stories
def climb_stairs(self, stairs_per_story=10):
for story in range(self.stories):
for stair in range(1, stairs_per_story):
yield stair
yield 'Phew!'
yield 'Done!'
if __name__ == '__main__':
fire.Fire(Building)
可采用如下方式调用类方法:
$ python example.py --name="Sherrerd Hall" --stories=3 climb_stairs 10
$ python example.py --name="Sherrerd Hall" climb_stairs --stairs_per_story=10
$ python example.py --name="Sherrerd Hall" climb_stairs --stairs-per-story 10
$ python example.py climb-stairs --stairs-per-story 10 --name="Sherrerd Hall"
3. 获取属性值
在命令行中,也可以直接获取属性值:
import fire
class Property(object):
def __init__(self, p: int = 1):
self.p = p
self.add()
def add(self):
for i in range(10):
self.p += i
if __name__ == '__main__':
fire.Fire(Property)
获取类属性值示例如下:
$ python helloFire.py p
46
$ python helloFire.py --p=5 p
51