Saltar al contenido

TypeError: el objeto ‘list’ no se puede llamar en Python

Esta noticia fue analizado por nuestros expertos para asegurar la exactitud de nuestra esta división.

Solución:

Parece que has ocultado el nombre incorporado list apuntando a una clase con el mismo nombre apuntando a su instancia. 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 "", line 1, in 
TypeError: 'list' object is not callable

Creo que esto es bastante obvio. Python almacena los nombres de los objetos (las funciones y las clases también son objetos) en espacios de nombres (que se implementan como diccionarios), por lo que puede reescribir prácticamente cualquier nombre en cualquier ámbito. No aparecerá como un error de algún tipo. Como sabrá, 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:

  1. Espacios de nombres. Python admite espacios de nombres anidados. En teoría, puede anidar infinitamente espacios de nombres. Como ya he mencionado, los espacios de nombres son básicamente diccionarios de nombres y referencias a los objetos correspondientes. Cualquier módulo que cree obtiene su propio espacio de nombres “global”. De hecho, es solo un espacio de nombres local con respecto a ese módulo en particular.

  2. Alcance. Cuando hace 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 queden espacios de nombres superiores. En ese caso, obtienes un NameError. Las funciones y clases integradas residen en un espacio de nombres especial de orden superior __builtins__. Si declara una variable llamada list 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 variable var dentro de una función en su módulo, y otra variable var en el módulo. Entonces, si hace referencia var dentro de la función, nunca obtendrá el global var, porque hay un var en el espacio de nombres local: el intérprete no necesita buscarlo en otro lugar.

He aquí 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 "", line 1, in 
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, no hay nada especial en las incorporaciones de Python. Y su caso es un mero ejemplo de reglas universales. Será mejor que use un IDE (por ejemplo, una versión gratuita de PyCharm o Atom con complementos de Python) que resalte el sombreado de nombres para evitar tales errores.

También podría preguntarse qué es un “invocable”, en cuyo caso puede leer esta publicación. list, siendo una clase, es invocable. Llamar a una clase desencadena la construcción y la inicialización de la instancia. Una instancia también podría ser invocable, pero list las instancias no lo son. Si está aún más desconcertado por la distinción entre clases e instancias, es posible que desee leer la documentación (de manera bastante conveniente, la misma página cubre los espacios de nombres y el alcance).

Si desea obtener más información sobre las funciones integradas, lea la respuesta de Christian Dean.

PD Cuando inicia una sesión interactiva de Python, crea un módulo temporal.

Antes de que pueda comprender completamente qué significa el error y cómo resolverlo, es importante comprender qué es un nombre integrado en Python.

¿Qué es un nombre incorporado?

En Python, un nombre integrado es un nombre que el intérprete de Python ya ha asignado un valor predefinido. El valor puede ser un función o clase objeto. 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, existen actualmente 61 nombres incorporados. 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 Pitón no detenerte de re-asignar nombres integrados. Los nombres integrados no están reservados y Python permite que se utilicen también como nombres de variables.

Aquí hay un ejemplo usando el dict incorporado:

>>> dict = 
>>> dict

>>>

Como puede ver, Python nos permitió asignar el dict nombre, a hacer referencia a un objeto de diccionario.

¿Qué significa “TypeError: el objeto ‘list’ no se puede llamar”?

En pocas palabras, la razón por la que se produce el error es porque reasignado los nombre incorporadolist en el guión:

list = [1, 2, 3, 4, 5]

Cuando hiciste esto sobrescribió el valor predefinido del nombre integrado. Esto significa que ya no puede utilizar el valor predefinido de list, que es un objeto de clase que representa la lista de Python.

Por lo tanto, cuando intentó utilizar el list clase para crear una nueva lista a partir de una 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 puede llamar a un objeto de lista.

¿Cómo puedo corregir el error?

Suponga 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')

Ejecutar el código anterior produce el siguiente error:

Traceback (most recent call last):
  File "python", line 2, in 
TypeError: 'list' object is not callable

Si recibe un error similar como el anterior que dice que un “objeto no se puede llamar”, es probable que haya utilizado un nombre integrado como variable en su código. En este caso y en 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 nuestro 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, list, rangeetc.

Muchos linters e IDE le advertirán cuando intente utilizar un nombre integrado como variable. Si comete este error con frecuencia, puede valer la pena invertir en uno de estos programas.

No cambié el nombre de un nombre integrado, pero sigo obteniendo “TypeError: el objeto ‘list’ no es invocable”. ¿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 "", line 1, in 
    lst(0)
TypeError: 'list' object is not callable

Para obtener una explicación del problema completo y lo que se puede hacer para solucionarlo, consulte TypeError: el objeto ‘list’ 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

Calificaciones y reseñas

Recuerda algo, que tienes la capacidad de reseñar .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *