Nombrando variables y funciones en Python, todo sobre el uso de «_»

Introducción

Estoy seguro de que alguna vez has visto métodos, atributos o funciones que tienen algún tipo de guión o barra baja _ en su nombre. La verdad que al principio puede resultar un poco confuso, ya algunos pueden tenerlo al principio otros pueden tener incluso doble barra baja y otros pueden tenerlo al principio y al final. Todo un lío. Veamos las posibilidades:

  • Barra baja al principio _nombre
  • Barra baja al final nombre_
  • Barra baja sin contenido _
  • Doble barra baja al principio __nombre
  • Doble barra baja al principio y final __nombre__

Es importante notar que el uso de _ puede significar dos cosas. Por un lado puede significar una mera convención que no alterará el comportamiento de nuestro código. Por otro lado, en algunos casos su uso si modifica el comportamiento y su uso es relevante. Lo vemos a continuación.

Al inicio _nombre

El uso de _ antes del nombre de una variable, como podría ser _mi_variable no modifica el comportamiento del código. Su uso es una mera convención que ha sido acordada por los usuarios de Python, y que indica que esa variable no debería ser accedida desde fuera de la clase, pero puede serlo.

class Clase:
    def __init__(self):
        self._variable = 10

mi_clase = Clase()

# No se debería hacer, pero se puede
mi_clase._variable # 10

Su uso si que puede modificar el comportamiento del código usado con funciones. Una función es definida con _ no es importada por defecto si usamos from x import *.

Al final nombre_

Para entender el uso de la barra baja al final de una variable o función, es importante saber que Python tiene un determinado conjunto de palabras reservadas o keywords. Estas palabras no pueden ser usadas, porque de serlo Python se confundiría y no sabría como interpretarlas. Si por el motivo que sea, queremos llamar a una variable con el mismo nombre que una palabra reservada, podemos hacer algo así como class_. El siguiente código muestra que pasa si intentamos usar una palabra reservada para llamar a una variable.

#class = 5 # Error! class es una palabra reservada

Podemos usar _ para solucionarlo. Nótese que a diferencia de otras formas de usar _ en este caso no modifica comportamiento, por lo que su uso es arbitrario.

class_ = 5
def_ = 10

Una única _

Su uso suele ser común cuando queremos descartar una variable que por ejemplo pueda devolver una función. Veamos un ejemplo de una función que devuelve dos parámetros, la suma y la resta de dos variables.

def sumayresta(a, b):
    return (a+b), (a-b)

Tal vez queramos sólo el valor de la suma y no nos interese el valor de la resta. Para ello podríamos hacer lo siguiente.

suma, _ = sumayresta(5, 5)
# 10

Es una forma de decir "no me interesa esta variable", pero como no se puede dejar el hueco vacío, se usa _ para rellenarlo.

Doble al principio __nombre

A diferencia del uso de una sola barra baja, el uso de la doble __ en un atributo o método hace que Python lo oculte al exterior. Existe un concepto muy interesante y particular de Python llamado name mangling, del que te recomendamos leer más.

Por lo tanto, en el siguiente ejemplo __nombre no será accesible desde el exterior de la clase. Por supuesto si que podría accederse desde la propia clase.

class Clase:
    def __init__(self):
        self.__variable = 10

mi_clase = Clase()
#mi_clase.__variable # Error! No es accesible

Doble al principio y final __nombre__

Por último, el uso de __ al principio y al final de un nombre tiene especial relevancia cuando es aplicado a métodos. De hecho, a lo largo de este post ya has visto el uso de __init__ varias veces. Se trata de una forma que usa Python para designar a los conocidos como métodos mágicos como pueden ser también el __call__ o el __le__. Por norma general, es mejor no definir métodos propios con estos nombres, y limitarse a utilizar los que Python ya ofrece.

class Clase:
    def __init__(self):
        print("Init")

¡Deja un comentario!

avatar
  Subscribe  
Notify of