PROJET AUTOBLOG


Sam et Max

source: Sam et Max

⇐ retour index

La plus belle manière de parser les arguments de script en python

lundi 3 mars 2014 à 15:06

On peut parser sys.argv à la main, mais c’est fragile.

On peut utiliser getopt ou optpase, mais c’est déprécié.

On peut adopter le nouveau module de la stdlib, vers argparse, mais c’est compliqué.

Alors j’installais toujours clize.

Mais depuis que j’ai rencontré docopt, j’ai largué clize (c’est pas moi chérie, c’est toi) et on vit en amoureux tous les deux en élevant des scripts dans une ferme dans les Alpes.

pip install docopt

Docopt fonctionne à l’envers de la plupart des libs de ce genre : vous écrivez le message d’aide de votre script, et ça génère le parsing des arguments. La syntaxe de l’aide est de type posix, donc si vous avez utilisez un -h ou la commande man un jour, vous la connaissez déjà.

Voici comment ça marche :

help = """Le nom de mon programme trop cool
 
Usage:
  nom_du_script.py <argument_positionel> [<argument_positionel_optionel>] [--flag-optionel]
 
Options:
  -h --help          C'est généré automatiquement.
  --option=<valeur>  Description de l'option.
 
Woot, un footer !
"""
 
from docopt import docopt
 
arguments = docopt(help)
print(arguments)

Si on passe rien de valide au script, l’usage est affiché automatiquement :

$ python nom_du_script.py 
Usage:
  nom_du_script.py <argument_positionel> [<argument_positionel_optionel>] [--flag-optionel]

Si on demande l’aide, en option, ben, l’aide quoi :

$ python nom_du_script.py -h
Le nom de mon programme trop cool
 
Usage:
  nom_du_script.py <argument_positionel> [<argument_positionel_optionel>] [--flag-optionel]
 
Options:
  -h --help          C'est généré automatiquement.
  --option=<valeur>  Description de l'option.
 
Woot, un footer !

Et si on passe des arguments, on les récupère dans un simple dictionnaire :

$ python nom_du_script.py yo
{'--flag-optionel': False,
 '<argument_positionel>': 'yo',
 '<argument_positionel_optionel>': None}
 
$ python nom_du_script.py yo man
{'--flag-optionel': False,
 '<argument_positionel>': 'yo',
 '<argument_positionel_optionel>': 'man'}
 
 $ python nom_du_script.py yo --flag-optionel
{'--flag-optionel': True,
 '<argument_positionel>': 'yo',
 '<argument_positionel_optionel>': None}

Ça peut générer des choses complexes avec des tas de combinaisons d’options, des sous-commandes et tout le bordel.

Généralement on en profite pour faire ça proprement, en mettant l’usage en docstring du script, en calant une version et en rajoutant un if __main__:

 
"""Uber script.
 
Usage:
  schnell.py scheisse 
  schnell.py bier 
 
Options:
  -h --help      _o/
  --version      \o_
  --blitz=krieg  \o/
 
"""
 
from docopt import docopt
 
 
if __name__ == '__main__':
    # __doc__ contient automatiquement la docstring du module
    # en cours
    arguments = docopt(__doc__, version='0.1')
    print(arguments)
$ python schnell.py --version
0.1
 
$ python schnell.py bier
{'bier': True,
 'scheisse': False}

flattr this!

Les exceptions sont itérables

lundi 3 mars 2014 à 00:49

Ok, c’est une bizarrerie, mais je tenais à la partager car ça m’a bien niqué : une exception est itérable en Python

>>> for x in Exception('Doh !'):
...     print x
...
Doh !

Pourquoi ? J’en ai aucune idée. Mais j’ai voulu faire un algo récursif sur des structures imbriquées contenant des exceptions. Et ça buggait. Parce que ça parcourait aussi les exceptions.

Le piège vicieux dans lequel peu de gens risquent de tomber vu qu’on programme pas ça tous les jours. Mais tout de même, une étrangetée de Python. Peut être un héritage de l’époque où on pouvait faire un raise sur une string.

flattr this!

Pour licencier quelqu’un, donnez lui une grosse cylindrée

samedi 1 mars 2014 à 21:34

Un de mes colocs s’est trouvé une copine (très) belle, intelligente et dont la famille est (très, très, trèèèèèèès) riche. Et en plus super sympa. Attendez, ne ragequittez pas la vie tout de suite, c’est juste l’intro !

Comme elle est une femme libérée, tout ça, elle bosse quand même. Même pas pistonnée. Une fille bien je vous dis. Et une partie de son taff, c’est de licencier des gens.

C’est tout de suite moins marrant.

Mais en France, on ne peux pas licencier quelqu’un parce qu’il est nul à son job et vous coûte plus cher qu’il vous rapporte. Tant pis si ça coule votre boîte, soit vous vous coltinez votre boulet, soit vous le virez avec une indemnité qui vous empêchera de budgéter son remplaçant.

C’est génial.

Ah ces patrons, tous des salauds d’exploiteurs.

Évidement, il est rare qu’un boulet accepte de se faire détacher à l’amiable.

La meuf en question a donc une astuce en béton : donner une grosse voiture de fonction au mec. Oui parce qu’apparemment ça marche qu’avec les mecs.

Rapidement, il va se prendre des amendes pour excès de vitesse puisque notre beau pays est truffé de radars pièges qui n’ont rien à voir avec la sécurité. Et la voiture a tellement de chevaux que passer la première est déjà un geste illégal sur la plupart des routes.

Le premier PV, c’est un avertissement. Le second sert à monter son dossier de renvoie pour faute. Car oui, quand c’est un véhicule de fonction, prendre une amende, c’est une faute.

Ouch.

Mais bon, c’est tellement con de devoir en arriver là. Moi je me suis fais viré de mon premier job pour avoir insulté mon employeur devant toute l’équipe (j’étais en période d’essai). Aujourd’hui, il m’arrive régulièrement de virer mes clients (si, si, mes clients).

Mais en France, on est encore en mode lutte des classes. Le boss est un enfoiré d’esclavagiste plein aux as. L’employé est un fainéant profiteur tire-au flanc. On ne peux pas rendre l’embauche et le renvoie ou la dem’ facile, ça péterait tout le mythe. On risquerait de prendre les travailleurs pour des personnes intelligentes.

flattr this!

“C’est ton avis mec”

vendredi 28 février 2014 à 21:17

Oui connard, c’est mon avis. C’est mon compte twitter. C’est mon blog. C’est mon comment. Bien sûr que c’est mon avis. Bien sûr que c’est partial. Tu t’attendais à quoi ? Une déclaration de l’ONU ? Un truc lissé et sans couleur dont la lividité de la saveur n’a d’égale que l’aseptisation de la forme ?

Va te faire foutre.

Internet est fait pour ça. Internet est fait pour avoir de l’asymétrie et des surfaces rugueuses. Il est fait pour que les gens disent ce qu’ils pensent comme ils le pensent, pas comme on a envie de le lire.

Si ça ne te plait pas, c’est très simple, il suffit de bouger les cils. C’est pas un trop gros effort non ?

flattr this!

Le dossier sur la POO fait peau neuve

jeudi 27 février 2014 à 11:03

Je me répète, mais on doit énormément aux relecteurs sur ce blog. Ils ne font pas de bruit, mais ils passent derrière, tels des nettoyeurs de scènes de crimes sur notre prose sanglante.

Vous trouvez qu’il y a beaucoup de fautes sur le blog ? Imaginez si ils n’étaient pas là !

Comme le notre, leur boulot est 100% bénévole, et croyez-moi quand je vous dis que ça bouffe du temps.

Foxmask et Kontre sont les plus actifs, donc j’aimerais les remercier particulièrement.

Mais il y a aussi ceux qui font ça en comment, et Réchèr vient tout juste de terminer un travail de malade sur la relecture le l’INTEGRALITE (8 parties super longues) du dossier sur la POO.

Gloire aux relecteurs !

(Et vive le fromage)

flattr this!