Python propose un univers de modules, et donc un univers de possibilités pour faire parfois la même chose mais d’une manière plus efficace et/ou qui nous convient mieux, avec laquelle on est plus productive.

Aujourd’hui, je suis tombé sur un module sympa nommé fire, permettant de développer des applications command-line (cli) à gestion d’arguments et de documentations en suant le moins possible. Démo !

L’installation du module se fait via pip ou votre gestionnaire de paquet préféré. Pour ma part, je l’ai fait en virtualenv, donc ce sera pip:

$ pip install fire

Voici un exemple de script simple utilisant fire:

#!/usr/bin/env python3
# coding: utf-8

import fire

def prenom(name):
    """
    Return "Hello, <name>"
    :param name: your name
    """
    print("Hello,", name)


if __name__ == "__main__":
    fire.Fire(
        {
            "name": prenom
        }
    )

Pour l’utiliser, il suffit de définir des fonctions avec une repr précise comprenant :

  • la description de cette fonction
  • :param : à répéter autant de fois que vous avez d’arguments à votre fonction, afin de les décrire

Vos fonctions deviennent les sous-commandes de votre application. Une fois celles-ci écrites, vous n’avez qu'à instancier la classe Fire du module fire avec un dictionnaire formaté ainsi:

nom de la sous-commande : fonction reliée

Pour faire le mapping. Votre application est prête.

Exemple avec la mienne :

$ ./main.py name Sandro
Hello, Sandro

Si je veux afficher l’aide de mon application, un --help est construit par fire:

$ ./main.py --help
NAME
    main.py

SYNOPSIS
    main.py COMMAND

COMMANDS
    COMMAND is one of the following:

     name
       Return "Hello, <name>"

Et la même option existe pour chaque sous-commande:

$ ./main.py name --help
NAME
    main.py name - Return "Hello, <name>"

SYNOPSIS
    main.py name NAME

DESCRIPTION
    Return "Hello, <name>"

POSITIONAL ARGUMENTS
    NAME
        your name

NOTES
    You can also use flags syntax for POSITIONAL ARGUMENTS

C’est assez pratique et bien plus rapide qu’utiliser argparse, mais c’est toujours le même prix : on perd en modularité et en agilité.

fire est développé par Google. Et comme ils le disent eux-même:

When you call Fire, it fires off (executes) your command.