'id' es un nombre de variable incorrecto en Python

141

¿Por qué es malo nombrar una variable iden Python?

Brian Buck
fuente
33
La mayoría de la gente anexar un carácter de subrayado a los identificadores que chocan con las órdenes internas / palabras clave: ID_, mapa_, List_, filter_, etc.
cdleary
3
Una solución más furtiva sería usar una variable ID.
Simon Kuang
46
Una mejor pregunta sería ... ¿Qué genio pensó que era una buena idea usar un nombre genérico tan común para una función incorporada?
Básico

Respuestas:

143

id() es un elemento fundamental incorporado:

Ayuda sobre la función incorporada iden el módulo __builtin__:

id(...)

    id(object) -> integer

    Return the identity of an object.  This is guaranteed to be unique among
    simultaneously existing objects.  (Hint: it's the object's memory
    address.)

En general, usar nombres de variables que eclipsen una palabra clave o una función incorporada en cualquier idioma es una mala idea, incluso si está permitido.

Kevin Little
fuente
3
OK, para 'id' tienes razón, pero el comentario "en general ..." todavía se aplica, ¿no crees?
Kevin Little
55
Sin duda lo evitaría para los módulos globales. Para las variables restringidas al ámbito local, para que pueda ver que la misma función nunca necesitará usar el incorporado, no es algo de lo que me preocupe.
bobince 02 de
@Caramdir: Buena captura, idestaba programada para su eliminación de una vez, pero finalmente decidieron no eliminarla. Ya no puedo editar mi comentario original, por lo que lo eliminaré para evitar confundir a las personas en el futuro.
Eli Courtwright
20
@EliCourtwright Ojalá lo hubieran eliminado. ¡Qué método mal nombrado! Un nombre genérico y común utilizado en miles de lugares (donde el contexto da sentido). Entonces, ¿alguien decidió usarlo como un nombre global donde no hay contexto?
Básico
2
Sorprendentemente, utiliza el tutorial de expresiones regulares de Python de Google ( developers.google.com/edu/python/regular-expressions ) str = 'an example word:cat!!'. ¿Hay algo en alguna de las PEP que diga que no hagas esto?
wordsforthewise
57

En PEP 8 - Guía de estilo para el código Python , la siguiente guía aparece en la sección Descriptiva: Estilos de nombres :

  • single_trailing_underscore_ : utilizado por convención para evitar conflictos con la palabra clave Python, p. ej.

    Tkinter.Toplevel(master, class_='ClassName')

Entonces, para responder la pregunta, un ejemplo que aplica esta guía es:

id_ = 42

La inclusión del guión bajo final en el nombre de la variable deja en claro la intención (para aquellos familiarizados con la guía en PEP 8).

DavidRR
fuente
1
Esto no responde la pregunta real, pero +1 para la convención de nomenclatura PEP-8
ege
Un buen consejo, pero ides una construcción incorporada, no una palabra clave, y esto no explica por qué es malo ocultar una construcción incorporada.
wjandrea
51

ides una función incorporada que proporciona la identidad de un objeto (que también es su dirección de memoria en CPython). Si nombra una de sus funciones id, tendrá que decir builtins.idpara obtener el original (o __builtins__.iden CPython). Renombrar idglobalmente es confuso en cualquier cosa que no sea un script pequeño.

Sin embargo, reutilizar los nombres integrados como variables no es tan malo siempre que el uso sea local. Python tiene muchas funciones integradas que (1) tienen nombres comunes y (2) de todos modos no usará mucho. Usarlos como variables locales o como miembros de un objeto está bien porque es obvio por contexto lo que estás haciendo:

Ejemplo:

def numbered(filename):
    with open(filename) as file:
        for i, input in enumerate(file):
            print("%s:\t%s" % (i, input), end='')

Algunos complementos con nombres tentadores:

  • id
  • file
  • list, dict
  • map
  • all, any
  • complex, int
  • dir
  • input
  • slice
  • buffer
  • sum
  • min, max
  • object
Nathan Shively-Sanders
fuente
8
PEP 8 , que se actualizó el 01 de agosto de 2013, ahora aconseja evitar posibles confusiones simplemente agregando _el nombre de la variable. Por favor mira mi respuesta .
DavidRR
1
Vale la pena señalar que la idfunción que devuelve la dirección de memoria de un objeto es un detalle de implementación de CPython. También vale la pena señalar que la función solo es necesaria para devolver un número diferente para cualquiera de los dos objetos existentes . Si un objeto es basura recolectada, su identificación puede ser reciclada.
Zac critica el
@Zac Gracias! Edité la respuesta para agregar ese punto sobre la dirección de memoria y un enlace para que la gente pueda leer más.
wjandrea
42

Podría decir algo impopular aquí: id()es una función incorporada bastante especializada que rara vez se usa en la lógica empresarial. Por lo tanto, no veo ningún problema en usarlo como un nombre de variable en una función ajustada y bien escrita, donde está claro que id no significa la función incorporada.

Sebastian Rittau
fuente
1
En respuesta a:> id es una función incorporada bastante especializada> que rara vez se usa en> lógica empresarial. Por lo tanto, no veo un problema al usarlo como una variable> nombre en una función ajustada y bien escrita, donde está claro que id> no significa la función incorporada. Si bien esto es cierto, probablemente sea una buena idea ser más específico con este nombre de variable que simplemente "id". Muchas cosas tienen identificadores (especialmente si está trabajando con un RDBMS), y como nos dice la segunda línea de The Zen of Python de Tim Peters :> Explícito es mejor que implícito. Vea el resto corriendo:import this
Ross
9
Sin embargo, lo evitaría si fuera posible. Incluso si no es por otra razón que no escuchar a los compañeros de trabajo quejarse. :-)
Jason Baker
1
Estoy completamente de acuerdo: nombrar una variable "id" en una función pequeña (y, por lo tanto, el alcance) es inofensivo. Muy pocas personas usan el idbuiltin de todos modos. Dicho esto, me tomó un tiempo cuando un colega anuló el listedificio con una variable local. Entonces, la regla general que otras personas mencionan todavía tiene sentido.
silviot
5

Es malo nombrar cualquier variable después de una función integrada. Una de las razones es porque puede ser confuso para un lector que no sabe que se anula el nombre.

Toni Ruža
fuente
2

ides una función incorporada en Python. Asignar un valor a idanulará la función. Es mejor agregar un prefijo como en some_ido usarlo en una capitalización diferente como en ID.

La función integrada toma un solo argumento y devuelve un número entero para la dirección de memoria del objeto que pasó (en CPython).

>>> id(1)
9787760
>>> x = 1
>>> id(x)
9787760
Brian Buck
fuente
2
tenga en cuenta que puede nombrar un atributo de clase o método 'id', que no tocará la función integrada.
Toni Ruža
0

Porque es el nombre de una función integrada.

ahockley
fuente
0

Otros han mencionado que es confuso, pero quiero ampliar por qué . Aquí hay un ejemplo, basado en una historia real. Básicamente, escribo una clase que toma un idparámetro pero luego trato de usar el incorporado idmás tarde.

class Employee:
    def __init__(self, name, id):
        """Create employee, with their name and badge id."""
        self.name = name
        self.id = id
        # ... lots more code, making you forget about the parameter names
        print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))

tay = Employee('Taylor Swift', 1985)

Rendimiento esperado:

Created Employee 'Taylor Swift' at 0x7efde30ae910

Salida real:

Traceback (most recent call last):
  File "company.py", line 9, in <module>
    tay = Employee('Taylor Swift', 1985)
  File "company.py", line 7, in __init__
    print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))
TypeError: 'int' object is not callable

¿Eh? ¿Dónde estoy tratando de llamar a un int? Esas son todas incorporadas ...

Si lo nombrara badge_ido id_, no habría tenido este problema.

wjandrea
fuente
-6

Debido a que Python es un lenguaje dinámico, generalmente no es una buena idea dar el mismo nombre a una variable y una función. id () es una función en python, por lo que se recomienda no usar una variable llamada id. Teniendo eso en cuenta, eso se aplica a todas las funciones que podría usar ... una variable no debe tener el mismo nombre que una función.

gatito
fuente
3
"Debido a que Python es un lenguaje dinámico, generalmente no es una buena idea dar el mismo nombre a una variable y una función". - No se puede dar a una variable y una función el mismo nombre. Nada que ver con que sea un lenguaje dinámico. Si te refieres a darles a las propiedades los mismos nombres que otros objetos en el mismo alcance, también estoy en desacuerdo. Puede tener una clase llamada "Key", una instancia de esa clase llamada "key" y una propiedad de otro objeto llamado "key", por ejemplo, "door.key".
Purrell el