Diverses utilisations des underscores dans les conventions de nommage expliquées ! !!

Rachit Tayal

Follow

Aug 6, 2019 – 5 min de lecture

Le trait de soulignement _ est spécial en Python. Alors que le trait de soulignement est utilisé pour les variables et les fonctions simplement en casse serpentine dans de nombreux langages, mais il a des significations spéciales en Python. Ils sont largement utilisés dans divers scénarios, y compris les cas où nous voudrions ignorer une certaine valeur, ou dans la déclaration de variables, de méthodes, etc.

Les tirets bas simples et doubles ont une signification dans les noms de variables et de méthodes Python. Une partie de la signification est simplement par convention tandis qu’une autre partie est appliquée par l’interpréteur Python.

Dans cet article, nous allons discuter des cinq modèles de soulignement et des conventions de nommage et de la façon dont ils affectent le comportement de nos programmes Python. Comprendre ces concepts aidera beaucoup, en particulier lors de l’écriture de code avancé.

À la fin de ce post, nous aurons une compréhension juste de comment et où utiliser quel motif de soulignement dans notre convention de nommage. Alors commençons.

Single Leading Underscore : _var

Le préfixe de soulignement est destiné à indiquer à un autre programmeur qu’une variable ou une méthode commençant par un seul soulignement est destinée à un usage interne. Cette convention est définie dans le PEP 8.

Un nom préfixé par un trait de soulignement (par exemple _spam) doit être traité comme une partie non publique de l’API (que ce soit une fonction, une méthode ou un membre de données). Il doit être considéré comme un détail d’implémentation et sujet à des modifications sans préavis.

Regardez l’exemple suivant :

class Person:
def __init__(self):
self.name = 'Sarah'
self._age = 26

Instaurons la classe ci-dessus et essayons d’accéder aux attributs name et _age.

>>> p = Person()>>> p.name
Sarah>>> p._age
26

Donc, le préfixe de soulignement unique en Python est simplement une convention convenue et n’impose aucune restriction sur l’accès à la valeur de cette variable.

Double soulignement en tête : __var

L’utilisation du double soulignement (__) devant un nom (spécifiquement un nom de méthode) n’est pas une convention ; il a une signification spécifique pour l’interprète.

Python malmène ces noms et il est utilisé pour éviter les conflits de noms avec les noms définis par les sous-classes.

C’est aussi ce qu’on appelle le name mangling – l’interprète change le nom de la variable d’une manière qui rend plus difficile la création de collisions lorsque la classe est étendue plus tard.

Pour mieux saisir, nous allons créer notre classe jouet pour l’expérimentation:

class Person:
def __init__(self):
self.name = 'Sarah'
self._age = 26
self.__id = 30

Regardons les attributs de son objet en utilisant la fonction intégrée dir():

>>> p = Person()
>>> dir(p)
>>> p.name
Sarah
>>> p._age
26>>> p.__id
AttributeError: 'Person' object has no attribute '__id'>>> p._Person__id
30

De la liste ci-dessus des attributs de l’objet, nous pouvons voir self.name et self._age apparaît inchangé et se comporte de la même manière.

Par contre, __id est mangé en _Person__id. C’est le nom mangé que l’interpréteur Python applique. Il fait cela pour protéger la variable de se faire surcharger dans les sous-classes.

Maintenant si nous créons une sous-classe de Person, disons Employee nous ne pouvons pas facilement surcharger la variable __id de Person.

Le comportement prévu ici est presque équivalent aux variables finales en Java et non virtuelles en C++.

Single Trailing Underscore : var_

Comme expliqué dans la doc PEP 8:

La convention de nommage par single trailing underscore est utilisée pour éviter les conflits avec les mots-clés Python.

Lorsque le nom le plus approprié pour une variable est déjà pris par un mot-clé, l’ajout d’une convention de single underscore est suivi pour rompre le conflit de nommage. L’exemple typique comprend l’utilisation de class ou d’autres mots-clés comme variables.

>>> def method(name, class='Classname'): # ❌
SyntaxError: "invalid syntax">>> def method(name, class_='Classname'): # ✅
... pass

Double soulignement en tête et en queue : __var__

Les noms qui ont un double soulignement de tête et de queue (« dunders ») sont réservés à un usage spécial comme la méthode__init__ pour les constructeurs d’objets, ou la méthode __call__ pour rendre un objet appelable. Ces méthodes sont connues sous le nom de méthodes dunder.

Pour autant que l’on soit concerné, il s’agit juste d’une convention, une façon pour le système Python d’utiliser des noms qui n’entreront pas en conflit avec les noms définis par l’utilisateur. Par conséquent, les dunders ne sont qu’une convention et sont laissés intacts par l’interprète Python.

class Person:
def __init__(self):
self.__name__ = 'Sarah'>>> Person().__name__
Sarah

Les dunders atteignent l’objectif souhaité de rendre certaines méthodes spéciales tout en les rendant identiques aux autres méthodes ordinaires dans tous les aspects, à l’exception de la convention de dénomination.

En toute honnêteté, rien ne nous empêche d’écrire notre propre nom de dunder mais il est préférable de rester à l’écart de leur utilisation dans nos programmes pour éviter les collisions avec les changements futurs du langage Python. (Reportez-vous à mon cette histoire qui détaille les dunders de manière exhaustive).

Single Underscore : _

Par convention, un seul soulignement autonome est parfois utilisé comme nom pour indiquer qu’une variable est temporaire ou insignifiante.

Par exemple, dans la boucle suivante, nous n’avons pas besoin d’accéder à l’index courant et nous pouvons utiliser « _ » pour indiquer qu’il s’agit juste d’une valeur temporaire:

>>> for _ in range(10):
... print('Welcome Sarah!!')

Encore, cette signification est « par convention » seulement et il n’y a pas de comportement spécial déclenché dans l’interpréteur Python. L’underscore simple est simplement un nom de variable valide qui est parfois utilisé à cette fin.

Conclusions:

Connaître les différents motifs d’underscores aidera à écrire notre code de façon plus pythonique. 😄

Voici un résumé rapide de nos 5 motifs de soulignement pour les conventions de nommage, que nous avons abordés ci-dessus.

  • Single Leading Underscore _var : Convention de nommage indiquant que le nom est destiné à un usage interne. Une indication pour les programmeurs et non appliquée par les programmeurs.
  • Double Leading Underscore __var : Déclenche le maniement du nom lorsqu’il est utilisé dans un contexte de classe. Appliqué par l’interpréteur Python.
  • Single Trailing Underscore var_ : Utilisé par convention pour éviter les conflits de noms avec les mots-clés Python.
  • Double Trailing Underscore __var__ : Indique des méthodes spéciales définies par le langage Python.
  • Underscore _ : Utilisé comme nom pour les variables temporaires.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.