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.
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?
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='')
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.
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.
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).
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.
classEmployee: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 namesprint('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 isnot 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.
"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".
ID
.Respuestas:
id()
es un elemento fundamental incorporado: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.
fuente
id
estaba 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 :
Entonces, para responder la pregunta, un ejemplo que aplica esta guía es:
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).
fuente
id
es una construcción incorporada, no una palabra clave, y esto no explica por qué es malo ocultar una construcción incorporada.id
es 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 funcionesid
, tendrá que decirbuiltins.id
para obtener el original (o__builtins__.id
en CPython). Renombrarid
globalmente 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:
Algunos complementos con nombres tentadores:
id
file
list
,dict
map
all
,any
complex
,int
dir
input
slice
buffer
sum
min
,max
object
fuente
_
el nombre de la variable. Por favor mira mi respuesta .id
funció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.fuente
import this
id
builtin de todos modos. Dicho esto, me tomó un tiempo cuando un colega anuló ellist
edificio con una variable local. Entonces, la regla general que otras personas mencionan todavía tiene sentido.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.
fuente
id
es una función incorporada en Python. Asignar un valor aid
anulará la función. Es mejor agregar un prefijo como ensome_id
o usarlo en una capitalización diferente como enID
.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).
fuente
Porque es el nombre de una función integrada.
fuente
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
id
parámetro pero luego trato de usar el incorporadoid
más tarde.Rendimiento esperado:
Salida real:
Si lo nombrara
badge_id
oid_
, no habría tenido este problema.fuente
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.
fuente