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

Soy novato en Python y sigo un tutorial. Hay un ejemplo de list en el tutorial:

 example = list('easyhoss') 

Ahora, en el tutorial, example= ['e','a',...,'s'] . Pero en mi caso me sale el siguiente error:

 >>> example = list('easyhoss') Traceback (most recent call last): File "", line 1, in  TypeError: 'list' object is not callable 

Por favor dime donde estoy equivocado Busqué TAN esto pero es diferente.

Parece que has seguido la list nombres incorporados que apunta a una clase con el mismo nombre que apunta 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 objetos (las funciones y las clases también son objetos) en los diccionarios (los espacios de nombres se implementan como diccionarios), por lo que puede volver a escribir casi cualquier nombre en cualquier ámbito. No aparecerá como un error de algún tipo. Como sabrán, 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 que enfrentaste.

  1. Espacios de nombres . Python soporta espacios de nombres nesteds. Teóricamente puedes anidar interminablemente 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 crees 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 tal nombre no existe, repite el bash 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 de alto orden especial __builtins__ . Si declara una variable nombrada 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. Luego, si hace referencia a var dentro de la función, nunca obtendrá la var global, porque hay una var en el espacio de nombres local; el intérprete no tiene necesidad de buscarla en otra parte.

Aquí hay una simple ilustración.

  >>> 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 se ve, no hay nada especial en las incorporaciones de Python. Y tu caso es un mero ejemplo de reglas universales. Será mejor que uses 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 estar preguntándose qué es un “llamable”, en cuyo caso puede leer la siguiente publicación: https://stackoverflow.com/a/111255/3846213 . list , al ser una clase, es llamable. Llamar a una clase activa la construcción e inicialización de instancias. Una instancia también podría ser invocable, pero las instancias de list no lo son. Si está aún más desconcertado por la distinción entre clases e instancias, entonces es posible que desee leer la documentación (muy convenientemente, la misma página cubre los espacios de nombres y el scope).

Si desea saber más sobre builtins, 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 lo que significa el error y cómo resolverlo, es importante entender qué es un nombre incorporado en Python.

¿Qué es un nombre incorporado?

En Python, un nombre incorporado es un nombre que el intérprete de Python ya tiene 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 scope. 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 – actualmente hay 61 nombres incorporados. Puede encontrar una lista completa de los nombres y cómo deben usarse, en la sección de documentación Funciones incorporadas .

Sin embargo, un punto importante a tener en cuenta es que Python no le impedirá volver a asignar nombres incorporados . Los nombres incorporados no están reservados, y Python permite que se usen también como nombres de variables.

Aquí hay un ejemplo usando el dict incorporado:

 >>> dict = {} >>> dict {} >>> 

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

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

En pocas palabras, la razón por la que se produce el error es porque volviste a asignar la list nombres incorporados en el script:

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

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

Por lo tanto, cuando intentó utilizar la clase de list para crear una nueva lista a partir de un objeto de range :

 myrange = list(range(1, 10)) 

Python levantó un error. La razón por la que el error dice que el objeto “lista no es invocable” es porque, como se dijo anteriormente, la list nombres se refería a un objeto de lista. Así que lo anterior sería el equivalente de hacer:

 [1, 2, 3, 4, 5](range(1, 10)) 

Lo que por supuesto no tiene sentido. No puedes 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') 

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 está recibiendo un error similar, como el de arriba, que dice que “el objeto no se puede llamar”, es probable que haya utilizado un nombre incorporado 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 ofensiva . Por ejemplo, para corregir el código anterior, podríamos cambiar el nombre de nuestra variable de list 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 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 incorporados como variables como str , dict , list , range , etc.

Muchos linters e IDE le avisarán cuando intente utilizar un nombre incorporado como variable. Si comete este error con frecuencia, puede valer la pena invertir su tiempo en uno de estos progtwigs.

No cambié el nombre de un nombre incorporado, pero sigo recibiendo “TypeError: el objeto ‘list’ 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 "", line 1, in  lst(0) TypeError: 'list' object is not callable 

Para obtener una explicación del problema completo y qué 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 seguimiento con

 del list 

Es posible que haya usado el nombre integrado “lista” para una variable en su código. Si está utilizando el bloc de notas 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 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 Shit + Tab, y verifique si Docstring lo muestra como una lista vacía.

Nombre de lista incorporada usada para mi lista

Cambie el nombre de mi lista a my_list pero aún así aparece el error, Shift + Tab muestra que la lista aún tiene los valores de my_list

Reinicia Kernal y todo está bien.

¿Por qué el objeto TypeError: 'list' object is not callable ?

Explicación:

Es porque definiste la list como una variable anterior (estoy bastante seguro), por lo que sería una lista, ya no la función, por eso todos no deberían nombrar las funciones de las variables, lo siguiente es lo mismo que lo que estás haciendo ahora:

 >>> [1,2,3]() Traceback (most recent call last): File "", line 1, in  [1,2,3]() TypeError: 'list' object is not callable >>> 

Así que necesitas que sea la función predeterminada de la list , ¿cómo detectar si es? Solo usa:

 >>> list  >>> list = [1,2,3] >>> list [1, 2, 3] >>> list() Traceback (most recent call last): File "", line 1, in  list() TypeError: 'list' object is not callable >>> 

¿Cómo detecto si un nombre de variable es una función? bueno, simplemente vea si tiene un color diferente, o use un código como:

 >>> 'list' in dir(__builtins__) True >>> 'blah' in dir(__builtins__) False >>> 

Después de esto, debe saber por qué no aparece el objeto TypeError: 'list' object is not callable .

Está bien, así que ahora …

¿Cómo arreglar este TypeError: 'list' object is not callable error TypeError: 'list' object is not callable ?

Código:

Tienes que hacer __builtins__.list() :

 >>> list = [1,2,3] >>> __builtins__.list() [] >>> 

O utilice [] :

 >>> list = [1,2,3] >>> [] [] >>> 

O eliminar la variable de list de la memoria:

 >>> list = [1,2,3] >>> del list >>> list() [] >>> 

O simplemente renombra la variable:

 >>> lst = [1,2,3] >>> list() [] >>> 

PS La última es la más preferible, supongo 🙂

Hay un montón de soluciones que funcionan.

Referencias:

‘id’ es un nombre de variable malo en Python

¿Cómo uso una palabra clave como nombre de variable?

¿Cómo usar la palabra clave reservada como el nombre de la variable en Python?

Para mí fue un servidor de matraz que devolvió algunos arrays de videos (que esperaba tener en formato json …)

añadiendo json.dumps(videos) solucionado este problema