Black : l'outil de formatage de code Python transforme les guillemets droits simples en guillemets doubles
Les auteurs expliquent leurs choix

La mise sur pied d’un utilitaire de formatage de code pour langage de programmation demande d’opérer des choix. En effet, pour mener à bien leur tâche, les concepteurs de tels outils disposent de guides de style : de la costaude doc qui, dans certains cas, leur laisse la main libre pour donner une orientation particulière à un design. En mettant sur pied Black, un outil de formatage de code Python, les têtes derrière l’outil ont dû « choisir leur camp » sur certains points de la proposition d’amélioration numéro 8 (PEP 8) de Python. Décisions et explications …

Nom : python.jpg
Affichages : 8488
Taille : 16,2 Ko

Guillemets simples vs doubles

En Python, une donnée de type string est une suite quelconque de caractères délimitée soit par des guillemets droits simples, soit par des guillemets doubles ou même triples. Le texte de la PEP 8 ne fait pas de recommandations particulières à ce sujet et suggère même aux développeurs de « choisir une règle et de s’en tenir à cette dernière », chose que les concepteurs de Black ont faite.

« Black préfère les guillemets doubles aux simples. L’outil va remplacer les derniers par les premiers à condition que cela n’entraîne pas l’introduction de plus de séquences d’échappement [\\] qu’avant », écrivent-ils. En d’autres termes, du code qui contient la chaîne 'ceci est un test' devient "ceci est un test" après formatage. D’après les auteurs de l’outil, plusieurs raisons justifient ce choix de design. « La raison principale d’opter pour un unique choix de guillemets est d’ordre esthétique. En avoir un seul type dans tout le texte réduit la distraction du lecteur », expliquent-ils.

Les concepteurs de Black ajoutent que l’usage des guillemets doubles est plus cohérent avec le C qui est l’un des langages avec lequel Python interagit le plus. Tertio, disent-ils, l’usage des guillemets doubles permet d’anticiper sur les apostrophes au sein du texte. En sus, il faut prendre en compte les cas de gestion des chaînes de caractères vides. À ce propos, les auteurs de l’outil sont d’avis que l’utilisation de guillemets doubles se prête mieux à l’encadrement d’une chaîne de caractère vide. Il faut en effet remarquer dans ce cas de figure qu’une chaîne vide encadrée par des guillemets simples est susceptible d’être confondue à un guillemet double.

Les concepteurs de Black sont d’avis que l’option guillemets doubles est cohérente avec les recommandations de la proposition d’amélioration numéro 257 (PEP 257) de Python. Et pour cause, cette dernière stipule que l’on doit toujours faire usage d’un triplet de guillemets doubles autour de la docstring pour les besoins de cohérence. Illustration avec une portion de code Python contenant un docstring sur plusieurs lignes :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
def complex(real=0.0, imag=0.0):
    """Form a complex number.
 
    Keyword arguments:
    real -- the real part (default 0.0)
    imag -- the imaginary part (default 0.0)
    """
    if imag == 0.0 and real == 0.0:
        return complex_zero
    ...
Une liste de choix de design non exhaustive

On peut également évoquer la façon dont Black traite l’opérateur : au sein de celui d’indiçage []. A ce propos, les têtes derrière l’outil de formatage de code ont choisi d’implémenter les recommandations de la PEP8. Ces dernières stipulent que l’insertion d’espaces autour de l’opérateur : peut s’avérer nécessaire pour bien signifier que ce dernier est de plus faible priorité à côté d’autres insérés en même temps que lui au sein de l’opérateur d’indiçage. Ceci signifie que la ligne de code x = m[a+1:b] devient x = m[a + 1 : b] après formatage. Pour bien asseoir les subtilités des choix de l’équipe Black, illustration avec des portions de code au sein desquelles l’opérateur : est utilisé seul au sein de celui d’indiçage :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
$ cat test.py
    x = [1,2,3]
    print(x[1: 3])
 
    $ black test.py
    test.py reformaté
 
    $ cat test.py
    x = [1, 2, 3]
    print(x[1:3])
On est bien loin de la liste complète de choix de conception que les auteurs de Black ont dû opéré. Les développeurs désireux d’aller plus en avant dans la compréhension de l’outil ont le détail dans le dépôt GitHub du projet.

L’outil requiert Python 3.6 au minimum pour tourner. Toutefois, d’après l’équipe de développeurs, il peut aussi servir au reformatage de code Python 2. Attention, Black est encore une bêta comme en témoigne le b au sein de son numéro de version (18.5b1).

Sources : GitHub, PEP 8, PEP 257

Et vous ?

Certes, le texte de la PEP8 ne donne pas de recommandation particulière au sujet de l’usage d’un type particulier de guillemets, mais il semble que les choix de l’équipe Black en la matière s’opposent au fonctionnement de la fonction repr() de Python, à savoir l’utilisation de guillemets simples à moins que la chaîne de caractères n’en contienne déjà. Qu’en pensez-vous ?

Quels commentaires faites-vous des raisons évoquées (confort visuel, cohérence avec le langage C et PEP 257, etc.) pour justifier le choix des guillemets doubles ?

Avez-vous testé l’outil ? Quel retour pouvez-vous en faire ?

Quel utilitaire utilisez-vous pour le formatage de votre code Python ? Comment le comparez-vous à Black ?

Voir aussi :

Python devient le langage de programmation le plus populaire de mai 2018, d'après le baromètre PyPL

En 2017, Python 2.7 est plus utilisé (63,7 %) que la version 3.x dans les projets commerciaux, selon Semaphore CI

À quoi ressemble la communauté Python fin 2017 ? Résultats d'une enquête menée par la fondation Python et JetBrains