¿Por qué es malo nombrar una variable iden Python?
ID.
¿Por qué es malo nombrar una variable iden Python?
ID.
Respuestas:
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.
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.
str = 'an example word:cat!!'. ¿Hay algo en alguna de las PEP que diga que no hagas esto?
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).
ides una construcción incorporada, no una palabra clave, y esto no explica por qué es malo ocultar una construcción incorporada.
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:
idfilelist, dictmapall, anycomplex, intdirinputslicebuffersummin, maxobject_el nombre de la variable. Por favor mira mi respuesta .
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.
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.
import this
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.
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
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.
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.