python-fireでコマンドライン引数が関数やメソッドに渡るようにする

python

python-fire は Python のオブジェクトから CLI を作れるライブラリ。

$ pip install fire

次のように fire.Fire() でラップするだけでコマンドライン引数を関数やメソッドに渡すことができる。

$ cat main.py
import fire

class FizzBuzz:
  def fizzbuzz(self, num):
    ret = ""
    if num % 3 == 0:
      ret += "fizz"
    if num % 5 == 0:
      ret += "buzz"
    if len(ret) != 0:
      return ret
    return str(num)

  def fizzbuzzs(self, nums):
    return [self.fizzbuzz(num) for num in nums]
    
if __name__ == '__main__':
  fire.Fire(FizzBuzz)

$ python main.py fizzbuzzs --nums="[2,21,30]"
2
fizz
fizzbuzz

引数は ast.literal_eval() で文字列や数値、list などに評価される

import ast
root = ast.parse('[{"a":100}]', mode='eval')
print(type(ast.literal_eval(root))) # <class 'list'>

そのほか REPL で実行したり trace を表示したりもできる。

$ python main.py -- --interactive
>>> FizzBuzz().fizzbuzz(10)
'buzz'

$ python main.py fizzbuzzs --nums="[2,21,30]" -- --trace
Fire trace:
1. Initial component
2. Instantiated class "FizzBuzz" (xxx/main.py:3)
3. Accessed property "fizzbuzzs" (xxx/main.py:14)
4. Called routine "fizzbuzzs" (xxx/main.py:14)