But du site

L'idée de ce site commence avec l'écriture de l'article "Python est l'avenir de PHP" paru en Mars 2011 dans le magazine "PHPSolutions".

L'article peut éveiller de vives réactions et le format papier ne permet pas de les collecter et d'y répondre. Il faut donc un blog pour résoudre ce problème.

Pourquoi le langage Python est considéré par beaucoup comme un langage d'avenir?
Il est maintenant courant de rencontrer des développeurs ou administrateurs système déclarer trouver le langage Python plus facile, maintenable, lisible, rapide à écrire, puissant et même joli.

mercredi 23 mars 2011

Python : La syntaxe n'est pas une question de gout

Lorsque dans l'article "Python est l'avenir de PHP?" je sous-entend que la syntaxe de Python est meilleure que celle de PHP, on me répond généralement que c'est une question de goût. Or ce qui est vrai pour beaucoup de langage, ne l'est pas dans le cas de Python.

Les délimiteurs de bloque
Dans la majorité des langages, le bloc sont délimités par des séparateurs de bloque. En C-like (C, C++, Java, PHP) ce sont les accolades {} alors qu'en Ruby, Basic et Pascal c'est le mot clé end qui clôture le bloque.
A ce niveau c'est effectivement une question de gout que de choisir entre les accolades {} et le couple begin/end.
Or, ce que l'humain comprend est plus proche du visuel et c'est pour cela que l'indentation est importante pour écrire un code "propre". Nous préférons tous lire du code bien indenté pour éviter de compter les accolades ou les end pour le comprendre.
Pour Python, l'idée est que ce que la machine interprète doit être ce que l'humain comprend. Ainsi un code ne peut être mal indenté.
Il faut aussi savoir qu'avec un syntaxe C, un code mal indenté peux être source d'incompréhension.
Par exemple le code suivant:
if(a>20)
    func_a();
    func_b();
    func_c();
va lance func_a seulement si a>20 et ensuite lancer func_b et func_c alors que si on le regarde rapidement, l'indentation sous-entend que func_b et func_c doivent aussi être lancé en fonction de a.
Ici l'exemple est simple, mais imaginez le même code avec des imbrications de bloc sur trois ou quatre niveaux.

C'est ce type de problème qui est source d'erreur ou de difficulté de compréhension du code. En Python, ce problème n'existe pas, le code qui s’exécute se comprend de la même façon.

Le séparateur de commande
En C/C++, Java, PHP... chaque fin de ligne (ou presque) et décorée d'un point virgule ;. L'idée est ici la même que pour les séparateurs de bloque : pour un humain, la fin de ligne est un bon séparateur de commande. Python utilise donc la fin de ligne comme séparateur de commande. Le point virgule est tout de même compris par l’interpréteur Python comme séparateur de commande afin de pouvoir en mettre plusieurs sur une même ligne. Ce n'est bien évidemment pas recommandé, mais utile dans certain cas particulier.

Conclusion
Beaucoup me diront encore que la syntaxe est une question de gout, mais essayez et vous vous rendrez vite compte (après quelques centaines de ligne de code)  que la syntaxe de Python permet une lecture plus rapide du code écrit par d'autre et que finalement elle vous rend plus productif.


Pour plus de détail vous pouvez aussi lire l'article sur la syntaxe de Python sur Wikipédia : http://en.wikipedia.org/wiki/Python_syntax_and_semantics


D'accord, mais pourquoi en faire un point si important? 
Statistiquement un développeur passe 70% de son temps à lire et à essayer de comprendre ce que les autres ont fait. Il parait donc important que chacun puisse lire correctement ce que les autres ont fait. C'est pour cela qu'il existe des conventions de codage. On sait tous que peu de développeur les respectes. Ici Python nous oblige au minimum à avoir du code bien indenté, le code est donc beaucoup plus simple à relire par d'autre. C'est par ce genre d’innovation que le travail des développeurs est simplifié est rendu plus agréable.

6 commentaires:

  1. All the points you're mentioning in your post are related to the developer itself. If you've been coding for a long time, you know how to indent properly your code. Python is forcing you to do it in one way. Other languages are more permissive.

    Python, in the contrary of (for instance) ActionScript or Java, has a huge lack of typing. And once again, it's the developer itself who has the choice to make a good usage or not.

    But I've seen so many times:

    def func(variable=None):
    ...
    # huge method
    if len(variable):

    len(None) throws an error.

    So yes, all the point you're mentioning are more related to how bad your developing skills are and your code style guide is. It has nothing to do with python or php.

    IE:
    variable = [self.method(self.method2(item)) for item in items if item.isSomething()]; self.execute()

    RépondreSupprimer
  2. Comparons d'abord ce qui est comparable.
    Et surtout :
    1. ça dépend du développeur
    2. ça dépend de l'éditeur utilisé et de la configuration de celui-ci
    3. ça dépend des règles de coding utilisées

    Bref, vaste sujet que voilà, assujettit à bien des controverses et autres trolls ...

    RépondreSupprimer
  3. C'est bien ces affirmations qui sont gênantes dans un processus de qualité logiciel. Nous aimons tous comprendre rapidement le code que nous lisons. C'est un confort de travail indéniable. Mais malheureusement nous utilisons souvent des règles différentes pour écrire notre code.
    En Python, une partie de ses règles ne sont plus commune à un groupe de développeur mais à tous les développeur Python.
    Ce n'est un pas un choix de chacun mais une obligatoire pour que le langage fasse ce que nous lui demandons.
    Cela ne fait pas tout mais c'est un rouage parmi d'autre qui permet au finale de gagner en lisibilité et en conforte de travaille.

    Quoi qu'il en soit, comme beaucoup, j'ai considérer au début que cette obligation était inutile et contraignante. En fait quand on s'y met vraiment, quelques jours plus tard, on apprécie vraiment d'écrire du code de cette manière et surtout de lire le code des autres avec la même facilité que le seins (et ce quelque soit le projet dont il fait partie).

    RépondreSupprimer
  4. Je peut trouver inversement un code illisible en Python, un ensemble non structure d'enchainement de fonction mal nommé il arrive de perdre facilement la fonction ou le bloc dans lequel on se trouve. De plus pour avoir pratiquer Python assez longtemps l'interprétation est plus longue que PHP et la gestion POO est faible...

    RépondreSupprimer
  5. Si tu n'arrive pas a te repérer avec les bloc c'est certainement que tu mélanges les tabulations et les espaces.
    Concernant la POO, peux tu donner quelques exemples car il me semble que le gestion objet est justement plus complète en Python qu'en PHP.

    RépondreSupprimer
  6. En ce qui concerne la syntaxe stricte c'est exactement le point qui m'a fait choisir python plutôt que Ruby (en plus du Php). Et je confirme en près de 5 ans de dev pro de PHP5 trop peu de développeurs PHP utilisent des règles STANDARD. Et j'insiste lourdement sur ce mot. Sans parler des frameworks utilisant souvent leur propre standard ! Quand on dit que cela dépend du niveau du développeur je suis entièrement d'accord, sachant que le niveau moyen du développeur PHP est nettement moins élevé que sur d'autres technos. Essayer de parler industrialisation / intégration continue / TDD / Mock / Design pattern (Adapter, Observer, Factory...) et Agilité... Beaucoup de paramètres sont à prendre en compte, le plus important est entre la chaise et l'écran !

    Sinon dommage que ce blog ne soit pas plus actif ! Je fais partie des devs Php qui aimerait migrer vers python (professionnellement parlant) et je sais que je ne suis pas le seul, un blog traitant des deux sujets serait idéal !

    RépondreSupprimer