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 nombresbuiltinsdeben 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.