¡Explicación del uso de guiones bajos en las convenciones de nomenclatura!!!

Rachit Tayal

Sigue

Aug 6, 2019 – 5 min read

El guión bajo _ es especial en Python. Mientras que el guión bajo se utiliza para variables y funciones en mayúsculas en muchos lenguajes, pero tiene un significado especial en Python. Se utilizan ampliamente en varios escenarios, incluyendo casos en los que nos gustaría ignorar algún valor, o en la declaración de variables, métodos, etc.

Los guiones bajos simples y dobles tienen un significado en los nombres de variables y métodos de Python. Parte del significado es simplemente por convención mientras que otra parte es impuesta por el intérprete de Python.

En este artículo discutiremos los cinco patrones de guiones bajos y las convenciones de nomenclatura y cómo afectan al comportamiento de nuestros programas Python. Entender estos conceptos nos ayudará mucho sobre todo a la hora de escribir código avanzado.

Al final de este post, tendremos una buena comprensión de cómo y dónde utilizar cada patrón de guión bajo en nuestra convención de nomenclatura. Así que vamos a empezar.

Single Leading Underscore: _var

El prefijo de guión bajo pretende ser una pista para otro programador de que una variable o método que comienza con un solo guión bajo está destinado a uso interno. Esta convención se define en el PEP 8.

Un nombre prefijado con un guión bajo (por ejemplo, _spam) debe ser tratado como una parte no pública de la API (ya sea una función, un método o un miembro de datos). Debe considerarse como un detalle de implementación y está sujeto a cambios sin previo aviso.

Echa un vistazo al siguiente ejemplo:

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

Instanciemos la clase anterior e intentemos acceder a los atributos name y _age.

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

Así que, el prefijo de guión bajo simple en Python es simplemente una convención acordada y no impone ninguna restricción en el acceso al valor de esa variable.

Subrayado doble inicial: __var

El uso de doble guión bajo (__) delante de un nombre (específicamente un nombre de método) no es una convención; tiene un significado específico para el intérprete.

Python manipula estos nombres y se utiliza para evitar choques de nombres con nombres definidos por subclases.

Esto también se llama name mangling – el intérprete cambia el nombre de la variable de una manera que hace más difícil crear colisiones cuando la clase se extiende más tarde.

Para entender mejor, vamos a crear nuestra clase de juguete para la experimentación:

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

Vamos a echar un vistazo a los atributos de su objeto utilizando la función incorporada 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 lista anterior de los atributos del objeto, podemos ver self.name y self._age aparece sin cambios y se comporta de la misma manera.

Sin embargo, __id se convierte en _Person__id. Este es el cambio de nombre que aplica el intérprete de Python. Lo hace para proteger la variable de ser sobrescrita en subclases.

Ahora bien, si creamos una subclase de Person, digamos Employee no podemos sobrescribir fácilmente la variable __id de Person.

El comportamiento previsto aquí es casi equivalente al de las variables finales en Java y no virtuales en C++.

Single Trailing Underscore: var_

Como se explica en PEP 8 docs:

La convención de nomenclatura de un solo guión bajo se utiliza para evitar conflictos con las palabras clave de Python.

Cuando el nombre más apropiado para una variable ya está tomado por una palabra clave, se sigue la convención de añadir un solo guión bajo para romper el conflicto de nomenclatura. Un ejemplo típico incluye el uso de class u otras palabras clave como variables.

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

Subrayado doble inicial y final: __var__

Los nombres que tienen doble guión bajo inicial y final («dunders») se reservan para un uso especial como el método__init__ para los constructores de objetos, o el método __call__ para hacer que el objeto se pueda llamar. Estos métodos se conocen como métodos dunder.

En lo que a uno se refiere, esto es sólo una convención, una forma de que el sistema Python utilice nombres que no entren en conflicto con los nombres definidos por el usuario. Por lo tanto, los dunders son sólo una convención y no son tocados por el intérprete de Python.

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

Los dunders logran el objetivo deseado de hacer que ciertos métodos sean especiales y al mismo tiempo hacerlos iguales a otros métodos planos en todos los aspectos excepto en la convención de nombres.

Para ser honestos, no hay nada que nos impida escribir nuestro propio nombre de dunder, pero es mejor mantenerse alejado de usarlos en nuestros programas para evitar colisiones con futuros cambios en el lenguaje Python. (Consulte mi esta historia que detalla ampliamente los dunders).

Single Underscore:

Por convención, un único guión bajo independiente se utiliza a veces como nombre para indicar que una variable es temporal o insignificante.

Por ejemplo, en el siguiente bucle no necesitamos acceder al índice en ejecución y podemos utilizar «_» para indicar que es sólo un valor temporal:

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

De nuevo, este significado es sólo «por convención» y no hay ningún comportamiento especial activado en el intérprete de Python. El guión bajo simple es simplemente un nombre de variable válido que a veces se utiliza para este propósito.

Conclusiones:

Conocer el patrón de los distintos guiones bajos nos ayudará a escribir nuestro código de forma más pitónica. 😄

Aquí tenemos un resumen rápido de nuestros 5 patrones de guiones bajos para las convenciones de nomenclatura, que hemos cubierto anteriormente.

  • Guión bajo simple inicial _var: Convención de nomenclatura que indica que el nombre es para uso interno. Una sugerencia para los programadores y no se aplica por los programadores.
  • Doble guión bajo inicial __var: Activa la manipulación del nombre cuando se utiliza en el contexto de la clase. Lo impone el intérprete de Python.
  • Guión bajo final simple var_: Usado por convención para evitar conflictos de nombres con palabras clave de Python.
  • Doble guión bajo al final __var__: Indica métodos especiales definidos por el lenguaje Python.
  • Guión bajo _: Se utiliza como nombre de variables temporales.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.