Les articles de GNU/Linux Magazine Hors-Série N°65

Développer une application, ce n'est pas seulement taper des lignes de code. C'est aussi se munir d'un environnement de travail qui fluidifie les choses, que ce soit pour le développement en lui-même, pour les tests, ou pour le déploiement sur d'autres systèmes. Pour faire tout cela en Python, on utilise ce que l'on appelle des environnements virtuels. Nous allons voir dans cet article comment les mettre en place, les utiliser et faire en sorte qu'ils puissent être déployés rapidement. Mais avant de voir tout cela, il faut comprendre comment installer des librairies en Python. C'est par cela que nous allons démarrer.
Le mode CLI pour Command Line Interface – interface en ligne de commande – est très prisé des développeurs : il permet d'obtenir une interface à cheval entre la ligne de commandes et l'interface graphique. On peut utiliser des paramètres pour obtenir un fonctionnement très précis ou bénéficier d'un menu autorisant différents choix.
Nous avons vu précédemment à la fois comment installer simplement des librairies Python avec les virtualenvs et pip, mais aussi comment faire en sorte que votre code à partir d'un CVS soit facilement déployable. Pour distribuer vos programmes ou vos librairies en passant par PyPI (ou une instance personnelle d'un dépôt de module Python), il vous faudra utiliser le module distutils. Celui-ci vous permettra de configurer l'installation de votre projet, de générer différentes versions et de publier celles-ci sur PyPI ou autre.
Utiliser un décorateur ou plutôt la syntaxe des décorateurs n'est pas très compliqué. En programmation orientée objet, pour définir des méthodes de classe, c'est un passage obligé. En revanche, comprendre et créer un décorateur est loin d'être aussi simple... Pour réellement comprendre ce que sont les décorateurs et à quoi ils servent, nous allons devoir repartir de la définition même d'une fonction. Je pense que bon nombre de lecteurs ne ressentiront pas forcément l'utilité du début de l'article, ils le trouveront peut-être trop long et seront enclin à passer rapidement à la suite mais, encore une fois, la notion de décorateur, définie dans le PEP 318 [1], est loin d'être triviale. Je préfère donc commencer par les définitions de base pour être certain que nous nous basons tous sur les mêmes concepts. Comme nous allons effectuer beaucoup de tests, j'utiliserai un interpréteur interactif et vous verrez donc apparaître dans le code d'exemple le symbole du prompt >>>. À moins de le préciser explicitement, j'utiliserai Python 2.7.
Python est un langage admirable pour tous les amoureux de l'algorithmique. L'un des cas d'utilisation les plus fréquents est l'itération. Dans ce domaine comme dans d'autres, Python fait preuve d'originalité. Cet article va présenter un panorama de ce qu'il faut savoir sur ce processus.
Multi-paradigme, le langage Python autorise le traitement de données via le paradigme fonctionnel, en particulier à l'aide de compréhensions de listes, d'ensembles ou de dictionnaires. Plus que de simples outils, il s'agit là de la manière privilégiée pour modifier des collections de données, par une écriture lisible, simple et compréhensible et pour ne rien gâcher, avec des performances souvent meilleures que l'équivalent écrit en procédural.
Python est un langage semi-interprété. En tant que tel, il produit un pseudo-code que l'on peut retrouver dans les fichiers d'extension .pyc (PYthon Compilé). Dans cet article, je vous propose d'étudier le pseudo-code Python. Python fournit le module dis, qui permet de désassembler le pseudo-code (souvent appelé bytecode) en un code plus lisible, l'opcode. Bien sûr, ne vous attendez pas à retrouver du code Python. Vous aurez simplement accès à l'opcode plus facilement lisible pour un être humain et comportant des mnémoniques.
Python est, comme vous le savez déjà très certainement, livré « piles incluses ». Le débogage étant un besoin essentiel pour tout développeur, la bibliothèque standard dispose d'un module dédié à cet aspect : le module pdb. Il est relativement simple d'utilisation et assez complet.
Les tests unitaires sont des éléments essentiels dans le développement de toute application, puisqu'ils permettent de s'éviter bien des déconvenues tout au long des processus de création et de maintenance de l'application. Ils doivent être associés à des tests fonctionnels et de performance, ainsi qu'à diverses autres métriques au sein d'un processus d'intégration complet.
Documenter un code est une perte de temps en première intention. On a le sentiment de ne pas être productif, que le projet sur lequel on travaille n'avance pas. Pourtant, pour peu que l'on développe en équipe ou que le projet soit mis en attente ne serait-ce qu'une semaine, la documentation va permettre de se remettre au travail beaucoup plus rapidement. Qui n'a jamais redécouvert un de ses propres codes au bout de quelques semaines sans comprendre comment il avait pu coder quelque chose d'aussi horrible/merveilleux ?
Python est un langage à typage dynamique et au modèle objet très original, à la fois minimaliste et très complet. Les deux caractéristiques font que le langage Python s'affranchit élégamment d'un certain nombre de contraintes qui pèsent sur les langages à typage statique, mais surtout, des très nombreuses problématiques qui y sont liées. La cohérence de ce modèle objet se fonde principalement sur la bonne utilisation du duck typing. Mais comme d'une part, elle ne résout pas tout et d'autre part, Python abhorre le mode de pensée « bondage and discipline », il a été créé le module abc qui est un bon compromis.
Lorsque l'on veut afficher un simple message en Python, il faut utiliser print. Mais parfois, l'information que l'on transmet à l'utilisateur n'est pas un simple message : il peut s'agir d'un avertissement suite à un problème rencontré par le programme, voire même d'une erreur. Les messages doivent alors être qualifiés et on peut même filtrer leur affichage en fonction de leur importance, les stocker dans des fichiers de log... Vous l'aurez compris, print ne suffit plus ! La journalisation des messages (ou logging en anglais) permet de conserver un historique des incidents survenus lors de l'exécution d'un programme. Les messages, généralement horodatés, sont stockés dans un fichier appelé journal ou fichier de log, mais ils peuvent également être affichés à l'écran. En Python, il existe un module bien pratique pour réaliser toutes les tâches liées à la tenue d'un tel journal : le module logging.
Lorsque l'on doit générer des données ayant une certaine structure, il peut être très intéressant d'utiliser des fichiers de modèles. Ces fichiers correspondent à des textes à trous, que l'on complétera à la demande avec une liste de valeurs, évitant ainsi la répétition d'opérations identiques pour la génération de fichiers ou de chaînes de caractères ayant la même structure.