L'article sur Python-fire est venu un peu, alors j'ai fait semblant de le voir.
ʻArgparse` est bon, non?
Considérons une CLI avec une simple sous-commande «retourne le résultat de l'ajout de deux arguments acceptés» ʻadd`. «calc-1.py» est celui qui reste à «python-fire», et «calc-2.py» le remplace par «argparse».
calc-1.py
import fire
class Calcurator(object):
def add(self, first, second):
return int(first) + int(second)
if __name__ == '__main__':
fire.Fire(Calcurator)
calc-2.py
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))
Je pense que la lisibilité sera considérablement améliorée. Si vous écrivez un petit traitement CLI, la partie analyseur d'arguments occupe une proportion considérable du code, il peut donc être apprécié si cela est éliminé.
Il semble que (subcommand) ---- hep
prendra les informations d'argument.
calc-1.py
$ 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
$ 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
Les informations sur les fichiers sont un peu intrusives, mais elles semblent jouer un rôle d'utilisation.
Si vous appelez sans réfléchir, calc-1.py
est évidemment plus lent.
$ 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
Si vous ne le comparez qu'une seule fois, cela ressemble à ceci. Il semble y avoir une différence d'environ 0,5 seconde.
Alors, j'ai essayé de faire une telle boucle.
loop.py
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
$ 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
J'ai essayé de le répéter plusieurs fois, mais en moyenne, il semble que cela prenne environ 0,4 à 0,5 seconde de plus. Étant donné que le traitement principal de l'exemple de code est trop simple, il semble qu'il y ait suffisamment de cas pour qu'il s'agisse d'une erreur de fonctionnement réel.
python-fire
sympa
Recommended Posts