¿Por qué "ejemplo = lista (...)" da como resultado "TypeError: el objeto 'lista' no es invocable"? [duplicar]
Intenté usar este código de un tutorial en REPL:
example = list('easyhoss')
El tutorial dice que example
debería ser igual a una lista ['e', 'a', 's', 'y', 'h', 'o', 's', 's']
. Pero en su lugar recibí un error:
>>> example = list('easyhoss')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
¿Por qué pasó esto?
Parece que has sombreado el nombre incorporado list
, que apunta a una clase, con el mismo nombre que apunta a una instancia de la misma. Aquí hay un ejemplo:
>>> example = list('easyhoss') # here `list` refers to the builtin class
>>> list = list('abc') # we create a variable `list` referencing an instance of `list`
>>> example = list('easyhoss') # here `list` refers to the instance
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: 'list' object is not callable
Creo que esto es bastante obvio. Python almacena nombres de objetos (las funciones y clases también son objetos) en espacios de nombres (que se implementan como diccionarios), por lo que puedes reescribir prácticamente cualquier nombre en cualquier ámbito. No aparecerá como un error de algún tipo. Como sabrás, Python enfatiza que "los casos especiales no son lo suficientemente especiales como para romper las reglas". Y hay dos reglas principales detrás del problema al que se ha enfrentado:
Espacios de nombres . Python admite espacios de nombres anidados. En teoría, puedes anidarlos infinitamente. Como ya mencioné, son básicamente diccionarios de nombres y referencias a objetos correspondientes. Cualquier módulo que cree obtiene su propio espacio de nombres "global", aunque en realidad es sólo un espacio de nombres local con respecto a ese módulo en particular.
Alcance . Cuando haces referencia a un nombre, el tiempo de ejecución de Python lo busca en el espacio de nombres local (con respecto a la referencia) y, si dicho nombre no existe, repite el intento en un espacio de nombres de nivel superior. Este proceso continúa hasta que no quedan espacios de nombres superiores. En ese caso obtienes un
NameError
. Las funciones y clases integradas residen en un espacio de nombres especial de alto orden__builtins__
. Si declara una variable nombradalist
en el espacio de nombres global de su módulo, el intérprete nunca buscará ese nombre en un espacio de nombres de nivel superior (es decir__builtins__
). De manera similar, suponga que crea una variablevar
dentro de una función en su módulo y otra variablevar
en el módulo. Luego, si hace referenciavar
dentro de la función, nunca obtendrá el globalvar
, porque hay unvar
en el espacio de nombres local; el intérprete no tiene necesidad de buscarlo en ningún otro lugar.
Aquí hay una ilustración sencilla.
>>> example = list("abc") # Works fine
>>>
>>> # Creating name "list" in the global namespace of the module
>>> list = list("abc")
>>>
>>> example = list("abc")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
>>> # Python looks for "list" and finds it in the global namespace,
>>> # but it's not the proper "list".
>>>
>>> # Let's remove "list" from the global namespace
>>> del list
>>> # Since there is no "list" in the global namespace of the module,
>>> # Python goes to a higher-level namespace to find the name.
>>> example = list("abc") # It works.
Entonces, como puede ver, las funciones integradas de Python no tienen nada de especial. Y su caso es un mero ejemplo de reglas universales. Será mejor que utilices un IDE (por ejemplo, una versión gratuita de PyCharm o Atom con complementos de Python) que resalte el sombreado de nombres para evitar este tipo de errores.
Quizás también te preguntes qué es un "invocable", en cuyo caso puedes leer esta publicación . list
, al ser una clase, se puede invocar. Llamar a una clase desencadena la construcción e inicialización de la instancia. Una instancia también podría ser invocable, pero list
las instancias no. Si está aún más desconcertado por la distinción entre clases e instancias, es posible que desee leer la documentación (muy convenientemente, la misma página cubre espacios de nombres y alcance).
Si desea obtener más información sobre las funciones integradas, lea la respuesta de Christian Dean .
PD: Cuando inicias una sesión interactiva de Python, creas un módulo temporal.
Antes de que pueda comprender completamente qué significa el error y cómo solucionarlo, es importante comprender qué es un nombre integrado en Python.
¿Qué es un nombre incorporado?
En Python, un nombre integrado es un nombre al que el intérprete de Python ya le ha asignado un valor predefinido . El valor puede ser una función o un objeto de clase . Estos nombres siempre están disponibles de forma predeterminada, sin importar el alcance. Algunos de los valores asignados a estos nombres representan tipos fundamentales del lenguaje Python, mientras que otros son simples y útiles.
A partir de la última versión de Python, 3.6.2 , hay actualmente 61 nombres integrados. Puede encontrar una lista completa de los nombres y cómo deben usarse en la sección de documentación Funciones integradas .
Sin embargo, un punto importante a tener en cuenta es que Python no le impedirá reasignar nombres integrados . Los nombres integrados no están reservados y Python también permite usarlos como nombres de variables.
Aquí hay un ejemplo usando el dict
incorporado:
>>> dict = {}
>>> dict
{}
>>>
Como puede ver, Python nos permitió asignar el dict
nombre para hacer referencia a un objeto de diccionario .
¿Qué significa "TypeError: el objeto 'lista' no es invocable"?
En pocas palabras, la razón por la que ocurre el error es porque reasignó el nombre integrado list
en el script:
list = [1, 2, 3, 4, 5]
Cuando hizo esto, sobrescribió el valor predefinido del nombre integrado . Esto significa que ya no puede usar el valor predefinido de list
, que es un objeto de clase que representa la lista de Python.
Por lo tanto, cuando intentaste usar la list
clase para crear una nueva lista a partir de un range
objeto:
myrange = list(range(1, 10))
Python generó un error. La razón por la que el error dice "el objeto 'lista' no es invocable" es porque, como se dijo anteriormente, el nombre list
se refería a un objeto de lista. Entonces lo anterior sería el equivalente a hacer:
[1, 2, 3, 4, 5](range(1, 10))
Lo cual por supuesto no tiene sentido. No se puede llamar a un objeto de lista.
¿Cómo puedo solucionar el error?
Supongamos que tiene un código como el siguiente:
list = [1, 2, 3, 4, 5]
myrange = list(range(1, 10))
for number in list:
if number in myrange:
print(number, 'is between 1 and 10')
La ejecución del código anterior produce el siguiente error:
Traceback (most recent call last):
File "python", line 2, in <module>
TypeError: 'list' object is not callable
Si recibe un error similar como el anterior que dice "un objeto no es invocable", es probable que haya utilizado un nombre integrado como variable en su código. En este y otros casos, la solución es tan simple como cambiar el nombre de la variable infractora . Por ejemplo, para corregir el código anterior, podríamos cambiar el nombre de nuestra list
variable a ints
:
ints = [1, 2, 3, 4, 5] # Rename "list" to "ints"
myrange = list(range(1, 10))
for number in ints: # Renamed "list" to "ints"
if number in myrange:
print(number, 'is between 1 and 10')
PEP8 , la guía de estilo oficial de Python, incluye muchas recomendaciones sobre cómo nombrar variables.
Este es un error muy común que cometen los usuarios nuevos y antiguos de Python. Por eso es importante evitar siempre el uso de nombres integrados como variables como , str
, dict
, etc.list
range
Muchos linters e IDE le avisarán cuando intente utilizar un nombre integrado como variable. Si comete este error con frecuencia, puede que valga la pena invertir en uno de estos programas.
No cambié el nombre de un nombre integrado, pero sigo recibiendo "TypeError: el objeto 'lista' no se puede llamar". ¿Lo que da?
Otra causa común del error anterior es intentar indexar una lista usando paréntesis ( ()
) en lugar de corchetes ( []
). Por ejemplo:
>>> lst = [1, 2]
>>> lst(0)
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
lst(0)
TypeError: 'list' object is not callable
Para obtener una explicación completa del problema y qué se puede hacer para solucionarlo, consulte TypeError: el objeto 'lista' no se puede llamar al intentar acceder a una lista .
Si está en una sesión interactiva y no desea reiniciar, puede eliminar el sombreado con
del list
En la liga de los estúpidos errores de los lunes por la mañana, usar corchetes en lugar de corchetes al intentar acceder a un elemento de la lista también le dará el mismo mensaje de error:
l=[1,2,3]
print(l[2])#GOOD
print(l(2))#BAD
TypeError: el objeto 'lista' no se puede invocar
Es posible que haya utilizado el nombre integrado 'lista' para una variable en su código. Si está utilizando el cuaderno Jupyter, a veces, incluso si cambia el nombre de esa variable de "lista" a algo diferente y vuelve a ejecutar esa celda, es posible que aún reciba el error. En este caso es necesario reiniciar el Kernal. Para asegurarse de que el nombre haya cambiado, haga clic en la palabra 'lista' cuando esté creando un objeto de lista y presione Shift+ Tab, y verifique si Docstring lo muestra como una lista vacía.