Arreglar el objeto de la lista de errores no invocable en Python

Isaac Tony 12 abril 2022
Arreglar el objeto de la lista de errores no invocable en Python

Los errores de tipos son algunas de las excepciones estándar comunes en los programas de Python. A menudo son el resultado de no cumplir con la sintaxis correcta o de una operación en un tipo de datos no compatible.

Este error a menudo surge cuando uno intenta llamar a un objeto no invocable como llamaríamos a un objeto de función normal. El fragmento de código a continuación devuelve un TypeError debido a la violación de la sintaxis de python correcta.

nums = [23, 34, 56, 67]
nums()

Producción :

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

Un objeto se considera invocable si un par de paréntesis finales puede desencadenar su ejecución, como ocurre con las funciones.

Afortunadamente, el estándar de Python también proporciona la función callable() que devuelve True si un objeto parece invocable y False si un objeto no es invocable.

En el ejemplo anterior a la lista, el objeto no se puede llamar y, por lo tanto, obtendríamos un Falso.

nums = [23, 34, 56, 67]
print(callable(nums))

Producción :

False

Las funciones, los métodos y las clases se pueden llamar en Python.

Esto se debe a que su ejecución se puede invocar mediante el operador de ejecución. La lista de objetos a los que se puede llamar en Python incluye funciones lambda y objetos a los que se puede llamar personalizados.

Los tipos de datos como tuplas, listas y diccionarios, por otro lado, no se pueden llamar. Por lo tanto, cualquier intento de ejecutarlos como funciones o métodos normales en Python daría como resultado un TypeError: object is not callable.

El objeto list TypeError que no se puede llamar también puede surgir al indexar elementos de listas usando paréntesis en lugar de corchetes.

En la mayoría de los lenguajes de programación, los corchetes se consideran los operadores de indexación predeterminados. Sin embargo, al escribir programas, a menudo podemos encontrarnos usando paréntesis en lugar de corchetes debido a su gran parecido.

El fragmento de código a continuación está destinado a devolver el elemento en el índice dos de la lista.

cars = ["Mazda", "Toyota", "BMW", "Tesla", "Hyundai"]
print(cars(2))

Producción :

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

Aunque los novatos a menudo cometen este error, también es un error sintáctico común cometido incluso por desarrolladores experimentados. Este error se puede resolver simplemente usando corchetes para indexar elementos en lugar de paréntesis, como se muestra a continuación.

cars = ["Mazda", "Toyota", "BMW", "Tesla", "Hyundai"]
print(cars[2])

Producción :

BMW

Es probable que se usen paréntesis para realizar la indexación en lugar de corchetes cuando se usa la comprensión de listas para acortar la sintaxis de Python. Esto se debe a que las listas por comprensión implican una combinación de varios corchetes y paréntesis en lugar de la sintaxis habitual de Python.

En el siguiente ejemplo, los paréntesis se han usado incorrectamente al construir la comprensión de la lista.

top_companies = [
    ["microsoft", "apple", "ibm"],
    ["tesla", "lucid", "nikola"],
    ["foxcon", "huawei", "tencent"],
]
result = [[row(index).upper() for index in range(len(row))] for row in top_companies]
print(result)

Producción :

Traceback (most recent call last):
  File "<string>", line 2, in <module>
  File "<string>", line 2, in <listcomp>
  File "<string>", line 2, in <listcomp>
TypeError: 'list' object is not callable

El ejemplo anterior tiene la intención de iterar a través de las listas anidadas utilizando los índices de los elementos y convertir sus elementos a mayúsculas. Para resolver el error, debemos inspeccionar el código y asegurarnos de usar corchetes para indexar, como se muestra a continuación.

top_companies = [
    ["microsoft", "apple", "ibm"],
    ["tesla", "lucid", "nikola"],
    ["foxcon", "huawei", "tencent"],
]
result = [[row[index].upper() for index in range(len(row))] for row in top_companies]
print(result)

Producción :

[['MICROSOFT', 'APPLE', 'IBM'], ['TESLA', 'LUCID', 'NIKOLA'], ['FOXCON', 'HUAWEI', 'TENCENT']]

TypeError: list object is not callable también se puede encontrar cuando se usa un nombre predefinido para nombrar una variable. Algunos de los nombres incorporados mal utilizados más comúnmente que podrían generar un error de este tipo incluyen; str, dict, lista y range.

En Python, el constructor de listas list() se usa para crear nuevas listas. Dado que este es un nombre incorporado predefinido y un objeto de clase que representa una lista de Python, no es bueno usar la lista de nombres como nombre de variable.

El uso de la lista de nombres para nombrar la variable podría dar como resultado el error list object is not callable, como se muestra en el ejemplo a continuación.

list = [24, 24, 25, 26, 28, 56]

nums_range = list(range(20, 40))

for number in list:
    if number in nums_range:
        print(number, "is the range")
    else:
        print(number, "number is not in range")

Producción :

Traceback (most recent call last):
  File "<string>", line 3, in <module>
TypeError: 'list' object is not callable

Usamos la lista de nombres predefinidos como nombre de variable en el ejemplo anterior. Intentamos usar el mismo nombre como constructor para crear una nueva lista en la segunda línea.

Como ya habíamos usado este nombre como nombre de variable, Python interpreta la segunda línea como un intento de llamar al objeto de la lista, lo que genera un error.

El error anterior se puede resolver cambiando el nombre del objeto de la lista a un nombre diferente. El nuevo nombre no debe ser una palabra clave ya que asegura que el constructor list() conserve sus propiedades funcionales.

nums = [23, 24, 25, 28, 27, 35, 78]

nums_range = list(range(20, 40))

for number in nums:
    if number in nums_range:
        print(number, "is the range")
    else:
        print(number, "is not in the range")

Producción :

23 is the range
24 is the range
25 is the range
28 is the range
27 is the range
35 is the range
78 is not in the range
Autor: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

Artículo relacionado - Python List

Artículo relacionado - Python Object

Artículo relacionado - Python Error