Ce qui me fait préférer Python

Depuis que j'ai débuté l'informatique, j'ai appris et utilisé de nombreux langages.
Concernant les langages uniquement, sans parler des APIs ou Framework ni des shells, plus ou moins en ordre chronologique, j'ai commencé sur Amstrad CPC par le Basic, puis l'assembleur z80.
Quand je suis passé au PC, j'ai commencé par le Turbo Basic de Borland, le Quick Basic de Microsoft, le Turbo Pascal de Borland, de l'assembleur x86, un tout petit peu de C, le Visual Basic de Microsoft, le Delphi de Borland.
Je suis ensuite passé à GNU/Linux en 1998, là j'ai découvert et utilisé le Perl, PHP, Python, j'ai approfondi le C et C++. J'ai étudié un peu Java et C#. J'ai utilisé un peu TCL. J'ai jetté un oeil sur Ruby, Ada, Lisp. Je connais de nom Caml, Scheme, Smaltalk, Eiffel ...

Pourquoi cette restrospective ? Parce que parmi tous les langages que j'ai étudié et/ou utilisé, à mes yeux, l'un d'eux sort du lot : Python.

Bien entendu, celui-ci sort du lot dans son domaine d'application. Par exemple, Python n'est pas adapté pour développer le noyau d'un système d'exploitation, ni pour réaliser un moteur de base de donnée dont l'objectif premier est la performance (bien qu'il existe une implémentation de base de donnée 100% développé en Python). Par contre je choisirais Python pour tous autres domaines où les performances bruts ne sont pas au coeur du besoin, par exemple pour :

  • des scripts d'administrations systèmes ou d'analyses de fichiers textuels.

  • tous les développements liés à l'Internet et en particulier au Web: scripts CGI, moteurs de recherche, agents intelligents, objets distribués...

  • l'accès aux bases de données (relationnelles).

  • la réalisation d'interfaces graphiques utilisateurs (par exemple pour des applications "lourdes") basées sur Gtk, Qt, wxWidgets.

  • la réalisation d'applications web

  • le calcul scientifique et l'imagerie. Python ne sert alors pas à écrire les algorithmes, mais à combiner et mettre en oeuvre rapidement des librairies de calcul écrites en langage compilé (C, C++, Fortran, Ada,...).

  • L'apprentissage de la programmation objet.

  • Le prototypage rapide d'applications. L'idée générale est de commencer par écrire une application en Python, de la tester (ou de la faire tester par le client pour d'éventuelles modifications du cahier des charges). Trois cas peuvent alors se présenter:

    • Les performances sont satisfaisantes, après optimisation éventuelle du code Python. On livre alors le produit tel quel au client.

    • Les performances ne sont pas satisfaisantes, mais l'analyse de l'exécution du programme (à l'aide du profiler de Python) montre que l'essentiel du temps d'exécution se passe dans une petite partie du programme. Les fonctions, ou les types de données, correspondants sont alors réécrits en C ou en C++, sans modification du reste du programme.

    • Sinon, il est toujours possible de récrire tout le programme, en utilisant la version Python comme un brouillon.
      Même dans le pire des trois cas, il est très vraisemblable que le temps de développement aura été sensiblement plus court que si le programme avait été développé directement en C ou en C++.

Le but de cet article et des autres articles qui traiteront du même thème est de vous présenter pourquoi j'apprécie Python plutôt qu'un autre langage.

Pour ceux qui me suggéreront Java, je répondrais que Java est un très bon langage, dont les performances (du langage) [1] sont très bonnes et meilleurs que Python, dont l'étendu des librairies, framework... est très importante... mais j'aime le coté agile, léger et simple de Python. D'autre part, je connais le langage Java mais j'ai de très modestes connaissances au niveau des frameworks qui gravitent autour de ce langage. Par conséquence, je ne ferais pas de comparaison entre Java et Python.

Je ne ferais pas non plus (ou alors très très peu) de comparaison avec Ruby car je ne connais pas beaucoup ce langage. Je connais les bases et les concepts de RoR (RubyOnRails) car j'ai survolé le livre Ruby On Rails. D'autre part, j'ai l'impression que la philosophie Python/Ruby sont assez proche.

Qu'est ce qui me fait préférer Python à d'autres langages :

  • D'un point de vue langage (syntaxique, fonctionnalités...) :
    • La syntaxe de Python est très simple et, combinée à des types de données évolués (listes, dictionnaires,...), conduit à des programmes à la fois très compacts et très lisibles. A fonctionnalités égales, un programme Python (abondamment commenté et présenté selon les canons standards) est souvent de 3 à 5 fois plus court qu'un programme C ou C++ (ou même Java) équivalent, ce qui représente en général un temps de développement de 5 à 10 fois plus court et une facilité de maintenance largement accrue [2].
    • Les arguments des fonctions peuvent être optionnels et/ou nommés (voir l'article que j'ai écris à ce sujet : Dans la série ''Ce qui me fait préférer Python'' : ''arguments optionnels et nommés'')
    • Les compréhensions de listes.
    • Python est un langage réflexif (il supporte la métaprogrammation, par exemple la capacité pour un objet de se rajouter ou de s'enlever des attributs ou des méthodes, ou même de changer de classe en cours d'exécution).
    • Introspectif (un grand nombre d'outils de développement, comme le débogueur ou le profileur, sont implantés en Python lui-même).
    • Le système de namespace des modules, système d'importation, et les possibilités offertes par ce mécanisme.
    • Les metaclass.
    • Les décorateurs.
    • Le fait qu'une classe soit un dict.
    • Presque tout est objet (par exemple les chaînes...).
    • self.__dict__.update(locals())
    • Les exceptions et l'arbre d'exceptions.
    • La surcharge de __call__ permettant d'exécuter l'instance d'un objet.
    • Les surcharges d'opérateurs : __repr__ , __str__, __unicode__, ...
    • les docstrings
    • import __future__ qui permet d'activer des fonctionnalités qui seront livrées par défauts dans les futures versions de Python
  • Caractéristique "non technique" de Python (philosophie, communauté, organisation, méthode...)
    • Python convient aussi bien à des scripts d'une dizaine de lignes qu'à des projets complexes de plusieurs dizaines de milliers de lignes;
    • Le langage Python est entièrement libre et les outils, librairies qui gravitent autour de ce langage sont eux aussi la plupart du temps libre.
    • La philosophie agile du langage, des librairies et des personnes qui composent la communauté Python.
    • L'annuaire Python Index qui regroupe à un endroit unique les librairies Python.
    • C'est super plaisant d'écrire du code python : exemple de comparaison "XML-RPC Python vs PHP".
    • La communauté de qualitée : être en contact avec des gens compétant et qui sont capables de réaliser des designs de qualités.
    • Le fait que python soit souvent utilisé comme langage de bindings des outils libres (même Mozilla s'y met).
    • Les designs pattern sont facilement réalisables (par exemple un décorateur, une fabrique, proxy, observateur...)
    • l'avenir avec PyPy: un des buts du projet est de générer une implémentation Python optimisée à partir de PyPy qui tournera plus rapidement que l'implémentation en C actuelle (CPython), bien que ce but ne soit pas encore atteint.
    • le fait que ce soit un langage "multidomaine" : web, application lourde (qt, gtk, wxwindows)
    • la grande quantité de librairies et de framework. Dans la majorité des cas ils/elles sont de grand(e)s qualité(e)s.
    • les PEP : des minis cahiers des charges soumis à l'approbation dans un premier temps de l'ensemble des développeurs Python, pour être affinés ou rejetés, puis sont acceptés ou non par Guido van Rossum (créateur et mainteneur de Python)
  • Outils intégrés ou proches du langage :
    • Les possibilités offertes par le prompt python (et IPython), parfaitement adapté pour tester une api, un objet ou même apprendre le langage.
    • Très bonne portabilité du langage et la librairie standard Python : réalisation assez simplement d'application mutliplateforme.
    • pdb : débogueur fortement intégré au langage.
    • Les possibilités de dépréciations de fonctions / classes ainsi que leurs déplacements automatiques.
    • virtualenv : permet de créer facilement et rapidement un environnement Python de développement ou de test. Peut même servir en production.
    • Les bindings en C facilement réalisable.
    • reStructuredText (docutils)
    • Rapidité et simplicité d'installation de paquet (egg) via easy_install.
    • distutils (Building and installing Python modules)
    • Possibilité de réaliser des modules très rapides grâce à Pyrex. Cet outil permet de transformer du code Python typé en langage C. Le code C est ensuite compilé pour produire un module très performant directement utilisable via Python.
    • Psyco pour accélérer l'exécution de programmes Python sans aucune modification des sources.
  • Outils agiles, tests...
    • Les doctests.
    • pylint : permettant de tester la qualité du code.
    • Les outils de profiling et de recouvrement des tests.
  • Les outils, librairies Python :
  • Les frameworks et outils web :
    • Zope3 : serveur d'application web orienté objet
    • Django : framework de développement Web en Python
    • Pylons : framework de développement Web en Python
    • Routes : URL mapper
    • Cherrypy : framework de développement Web en Python
    • Paste
    • ...

J'arrête la liste ici pour le moment car le but de cet article n'est pas de réaliser une liste exhaustive des outils Python. Je compte plutôt utiliser cet article comme une sorte de sommaire vers d'autres articles que j'écrirai à l'avenir.

[1]The Computer Language Benchmarks Game : http://shootout.alioth.debian.org/
[2]http://www.linux-center.org/articles/9812/python.html
Read and Post Comments

Mes flux :