1. 单个函数

之前已经简单介绍过了 Fire 使用,那么这边文章我们看下 Fire 其他的使用方式,还是以我们之前hello例子开始。

  1. import fire
  2. from typing import Text
  3. def hello(name: Text = "World") -> Text:
  4. """
  5. Hello function
  6. :param name: Any text
  7. :return: str
  8. """
  9. return f"Hello {name}!"
  10. if __name__ == '__main__':
  11. fire.Fire(hello) # 或者直接使用 fire.Fire() 也可以

除非所有函数都需要添加 CLI,否则不建议使用fire.Fire(),推荐将指定函数进行添加。

除了之前介绍的python hello.py --help,也可以使用python hello.py hello --help来查看具体函数的帮助信息。同时,我们还可以直接运行脚本,或者给脚本添加参数:

  1. $ python hello.py
  2. Hello World!
  3. $ python hello.py yumingmin
  4. Hello yumingmin!
  5. $ python hello.py --name=yumingmin
  6. Hello yumingmin!

2. 多个函数

那么 Fire 可不可以给多个函数对象添加命令行接口呢,当然是可以的。如果 Python 文件已经包含了多个函数,那么直接使用fire.Fire()即可(但不推荐),请看下面示例:

  1. import fire
  2. from typing import Text
  3. def add(x: int, y: int) -> int:
  4. return x + y
  5. def multiply(x: int, y: int) -> int:
  6. return x * y
  7. if __name__ == '__main__':
  8. fire.Fire({
  9. 'add': add,
  10. 'multiply': multiply,
  11. })

具体使用方法如下:

  1. $ python hello.py add 10 20
  2. 30
  3. $ python helloFire.py multiply --x=10 --y=20
  4. 200

3. 带和*参数的函数

  1. import fire
  2. def order_by_length(*items):
  3. """Orders items by length, breaking ties alphabetically."""
  4. sorted_items = sorted(items, key=lambda item: (len(str(item)), str(item)))
  5. return ' '.join(sorted_items)
  6. if __name__ == '__main__':
  7. fire.Fire(order_by_length)

直接注意的是,如果这里我们需要调用链式函数的话,我们需要添加-(默认情况是-,也可以通过-- --separator=来进行修改),否则函数会被当作参数被传递进去:

  1. $ python example.py dog cat elephant upper
  2. cat dog upper elephant
  3. $ python example.py dog cat elephant - upper
  4. CAT DOG ELEPHANT
  5. $ python example.py dog cat elephant X upper -- --separator=X
  6. CAT DOG ELEPHANT