python - what - Conflicto de nombres con la función incorporada
tutorial de django (7)
He cometido un error de la siguiente manera:
>>> list = [''a'', ''b'', ''c'']
Pero ahora quiero usar la list()
funciones incorporadas list()
. Como puede ver, hay un conflicto de nombres entre la list
nombres de list
y la list()
funciones incorporadas list()
.
¿Cómo puedo usar la list
como una función incorporada, no la variable sin reiniciar el shell de Python?
No use funciones integradas, o tipos como nombres de variables. Es tan simple como eso, el lenguaje no es para eso. Y no tiene sentido hacerlo.
No solo eso, sino que usar el nombre "lista" para una lista es muy ambiguo, y dudo que sea incluso remotamente utilizable en cualquier código real.
Hay algunas razones por las que NO deberías sombrear una incorporada. Algunos de los más serios están abajo:
- Compatibilidad, el código no funcionaría con otros módulos.
- Confusión, cualquiera que lea tu código no entenderá lo que está pasando.
- Circunstancias, muchas de las integradas usan otras integradas, cambiar una puede tener resultados inesperados en otros aspectos del código.
Para reparar el error, hay otra opción: si recordamos que la lista integrada de ''function'' list()
es en realidad una clase, entonces podemos hacer esto:
list = type([])
Sí, otros dicen arriba, no uses el nombre de un componente como un nombre de variable. Esto va por list
, dict
, etc.
Del mismo modo, como han dicho otros, tiene acceso a la list
tipos a través de __builtins__.list
. Así que si necesita llamar a la list
, aún puede encontrarla, siempre y cuando no haya recuperado __builtins__.list
también.
Es importante destacar que, sin embargo, la list
es un nombre. Lo has rebotado a una instancia de una lista. Si quiere que list
vuelva a significar <type ''list''>
, simplemente vuelva a enlazarla. En Python 2.7:
>>> __builtins__.list
<type ''list''>
>>> list
<type ''list''>
>>> list = [1, 2, 3]
>>> list
[1, 2, 3]
>>> fred = list
>>> fred
[1, 2, 3]
>>> list = __builtins__.list
>>> list
<type ''list''>
Siempre está disponible como __builtins__.list
:
>>> __builtins__.list
<class ''list''>
>>> list = [1, 2, 3]
>>> __builtins__.list
<class ''list''>
Sin embargo, si vuelve a encuadernar eso , se queda sin opciones.
También puede usar el módulo __builtin__
(o builtins
, sin los guiones bajos, en Python 3) pero tiene que importarlo. Pero estas son formas diferentes de deletrear lo mismo, en lugar de ser una opción adicional: modificar uno afecta a ambos:
>>> import builtins
>>> builtins.list
<class ''list''>
>>> builtins.list = [1, 2, 3]
>>> builtins.list
[1, 2, 3]
>>> __builtins__.list
[1, 2, 3]
Use __builtins__.list
__builtins__[''__list__'']
o __builtins__[''__list__'']
(según el contexto), o simplemente elimine la list
nuevamente ( __builtins__[''__list__'']
del list
).
No se necesitan importaciones:
>>> __builtins__.list
<type ''list''>
La presencia de __builtins__
es un detalle de implementación de CPython; en el módulo __main__
es un módulo, en cualquier otro lugar está el módulo __dict__
diccionario. Jython, IronPython y PyPy pueden optar por no poner esto a disposición. Use el módulo __builtin__
para esas plataformas, o para implementaciones compatibles con Python 3, el módulo builtins
:
>>> import __builtin__
>>> __builtin__.list
<type ''list''>
use __builtin__.list
en py2x:
>>> import __builtin__
>>> __builtin__.list
<type ''list''>
No use __builtins__.list
:
De los docs :
Detalle de la implementación de CPython: Los usuarios no deben tocar
__builtins__
; Es estrictamente un detalle de implementación. Los usuarios que deseen anular los valores en el espacio de nombresbuiltins
deben importar el__builtin__
(no ''s'') y modificar sus atributos de manera apropiada.
para py3x:
>>> import builtins
>>> builtins.list
<class ''list''>
Paso uno : vuelve a enlazar la lista con un nombre diferente
lst = list
Paso dos : borra la variable de list
del list
Paso tres : no lo hagas de nuevo
Prefiero esto sobre la __builtins__.list
Simplemente porque guarda la escritura, y aún no te queda una variable llamada list
. Sin embargo, siempre es mejor evitar el problema por completo. Al escribir el código de producción, recuerde siempre que las variables no tengan el mismo nombre que las funciones integradas.