with what tutorial para framework español develop applications python list built-in

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 nombres builtins 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.