大致了解python-fire和备忘录


关于Python-fire的文章出现了一点,所以我假装看到它。

已经确认可以工作的环境

  • Macbook Pro 13inch 2015年初
  • pyenv的Python 3.6.0

我自己阅读自述文件时的印象

argparse很好,不是吗?

实际比较

考虑一个带有简单的"返回添加两个接受的参数的结果"子命令add的CLI。
calc-1.pypython-fire剩下的,而calc-2.py是您用argparse替换的内容。

calc-1.py

1
2
3
4
5
6
7
8
import fire

class Calcurator(object):
    def add(self, first, second):
        return int(first) + int(second)

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

calc-2.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('mode')
parser.add_argument('first')
parser.add_argument('second')

class Calcurator(object):
    def add(self, first, second):
        return int(first) + int(second)

if __name__ == '__main__':
    args = parser.parse_args()
    cli = Calcurator()
    print(getattr(cli, args.mode)(args.first, args.second))

我认为可读性将大大提高。
如果您编写一些CLI处理程序,则参数解析器部分将占据相当一部分代码,因此,如果消除了这一点,将不胜感激。

帮助显示

似乎

(subcommand) -- --hep将接受参数信息。

calc-1.py

1
2
3
4
5
6
7
8
$ python calc-1.py add  -- --help
Type:        method
String form: <bound method Calcurator.add of <__main__.Calcurator object at 0x1036f8fd0>>
File:        ~/Dropbox (nijibox)/Applications/act/calc-1.py
Line:        5

Usage:       calc-1.py add FIRST SECOND
             calc-1.py add --first FIRST --second SECOND

calc-2.py

1
2
3
4
5
6
7
8
9
10
$ python calc-2.py -h
usage: calc-2.py [-h] mode first second

positional arguments:
  mode
  first
  second

optional arguments:
  -h, --help  show this help message and exit

文件信息有点干扰,但它似乎像"用法"一样起作用。

比较处理时间

如果您不加考虑就打电话,显然calc-1.py会慢一些。

1
2
3
4
5
6
7
$ time python calc-1.py add 12345 67890
80235
python calc-1.py add 12345 67890  0.60s user 0.29s system 30% cpu 2.945 total

$ time python calc-2.py add 12345 67890
80235
python calc-2.py add 12345 67890  0.07s user 0.07s system 77% cpu 0.179 total

仅一次比较时看起来像这样。似乎相差约0.5秒。

我试图用

进行这样的循环。

loop.py

1
2
3
4
5
6
7
8
9
import sys
import subprocess

script = sys.argv[1]
count = int(sys.argv[2])

for _ in range(count):
    proc = subprocess.Popen('python {} add 12345 67890'.format(script).split(), stdout=None)
    proc.communicate()

loop.py

1
2
3
4
5
6
7
8
9
10
11
$ time python loop.py calc-1.py 10 > /dev/null
python loop.py calc-1.py 10 > /dev/null  4.29s user 1.20s system 97% cpu 5.651 total

$ time python loop.py calc-2.py 10 > /dev/null
python loop.py calc-2.py 10 > /dev/null  0.40s user 0.17s system 93% cpu 0.614 total

$ time python loop.py calc-1.py 100 > /dev/null
python loop.py calc-1.py 100 > /dev/null  45.53s user 12.45s system 88% cpu 1:05.32 total

$ time python loop.py calc-2.py 100 > /dev/null
python loop.py calc-2.py 100 > /dev/null  3.39s user 1.06s system 94% cpu 4.731 total

我尝试重复几次,但平均起来似乎要多花0.4至0.5秒。
考虑到示例代码的主要处理过于简单,因此似乎有足够的情况在实际操作中会出错。

灯光验证后的印象

python-fire不错