Curso
En Python, un mensaje de error habitual es el siguiente:
'builtin_function_or_method' object is not subscriptable
Python genera este error cuando una función o método va seguido de los corchetes []
notation. Sin embargo, las funciones son objetos invocables. Por lo tanto, requieren paréntesis ()
, que a veces también se llaman corchetes.
Veamos un ejemplo en el que Python da este error:
numbers = [2, 4, 6, 8]
numbers.append[10]
Traceback (most recent call last):
...
TypeError: 'builtin_function_or_method' object is not subscriptable
La siguiente sección explora este error con más detalle.
Comprender el error
Las funciones de Python son objetos invocables, lo que significa que podemos utilizar paréntesis tras el nombre de la función para ejecutar el código de la definición de la función. Uno de los ejemplos más comunes de función incorporada en Python es print()
:
print("This is a built-in function")
This is a built-in function
Los paréntesis se utilizan para llamar a una función en Python. Sin embargo, si utilizas corchetes en lugar de paréntesis, se produce un error:
print["This is a built-in function"]
Traceback (most recent call last):
...
TypeError: 'builtin_function_or_method' object is not subscriptable
Vamos a desglosar el mensaje de error en sus partes clave:
- A 'builtin_function_or_method' object
- No subscribible
En el ejemplo anterior, print()
es una función incorporada. La descripción también se refiere a los métodos, que son funciones que forman parte de una clase. Python tiene muchos métodos integrados asociados a sus tipos de datos. Veamos otro ejemplo en el que aparece este mensaje de error:
name = "DataCamp"
print(name.count["a"])
Traceback (most recent call last):
...
TypeError: 'builtin_function_or_method' object is not subscriptable
El método .count()
, como las funciones en general, necesita paréntesis:
print(name.count("a"))
3
Este escenario es similar al ejemplo de la introducción, que contiene el método de lista .append()
. Aquí tienes la versión correcta utilizando paréntesis:
numbers = [2, 4, 6, 8]
numbers.append(10)
print(numbers)
[2, 4, 6, 8, 10]
TypeError: El objeto 'function' no es subscriptible
Python produce un error similar con las funciones definidas por el usuario:
def greet_person(name):
print(f"Hello {person}")
greet_person["James"]
Traceback (most recent call last):
...
TypeError: 'function' object is not subscriptable
Sin embargo, la función greet_person()
no es una de las funciones incorporadas en Python. El mensaje de error indica que se trata de una "función" y no de un "builtin_function_or_method".
La segunda parte del mensaje de error se refiere al término "subscriptible". Un objeto Python es subscriptible si podemos utilizar corchetes para acceder a uno de sus elementos. Un ejemplo común de objeto subscribible es una secuenciaque puede indexarse mediante corchetes:
print(numbers[0])
print(numbers[-1])
print(numbers[1:4])
2
10
[4, 6, 8]
Las tuplas y las cadenas son otros ejemplos de secuencias. Por tanto, también son subscribibles:
more_numbers = 10, 30, 50
print(more_numbers[0])
name = "DataCamp"
print(name[0])
10
'D'
Python asignaciones también son subscriptibles. El mapeo más común en Python es el diccionario:
points = {"James": 10, "Mary": 14}
print(points["Mary"])
14
Se utilizan claves de diccionario en lugar de índices dentro de los corchetes.
Python: Llamable vs. Suscriptible
Las secuencias y las asignaciones son ejemplos de objetos Python suscribibles. Podemos utilizar corchetes después del nombre del objeto para acceder a un objeto desde dentro de la estructura de datos. Una clase Python crea objetos subscribibles si define el método especial .__getitem__()
.
Las funciones y los métodos son ejemplos de objetos invocables. Podemos utilizar paréntesis después del nombre del objeto para llamarlos. Al llamar a una función o método se ejecuta el código de la definición de la función.
Las clases son otro objeto invocable de Python. Llamar a una clase crea una instancia. En general, un objeto Python es invocable si su clase define el método especial .__call__()
.
Python lanza un mensaje de error similar cuando intentamos llamar a un objeto que no es invocable:
numbers = [2, 4, 6, 8]
print(numbers(0))
Traceback (most recent call last):
...
TypeError: 'list' object is not callable
La variable numbers
es una lista, que no es invocable. La forma correcta de acceder al primer elemento de la lista es utilizar corchetes: numbers[0]
. Las funciones, los métodos y las clases son los objetos invocables más comunes en Python.
Corrige que el objeto 'builtin_function_or_method' no es subscribible`
Python lanza el mensaje de error ``'builtin_function_or_method' object is not subscriptable` cuando una función o método va seguido de corchetes. Busca corchetes justo después del nombre de la función o método y sustitúyelos por paréntesis.
En algunos casos, una función o método tiene una lista como argumento, que se define mediante corchetes. Sin embargo, ten en cuenta que la lista se define entre paréntesis:
number_of_values = len([10, 30, 50])
print(number_of_values)
numbers = [2, 4, 6, 8]
numbers.extend([10, 12])
print(numbers)
3
[2, 4, 6, 8, 10, 12]
En estos ejemplos, el nombre de la función o método va seguido de un paréntesis. El argumento entre paréntesis es una lista. La notación de corchetes para definir una lista difiere de la notación de corchetes utilizada con secuencias, mapeados y otros objetos subscribibles.
Consejos de depuración
Una cosa que puedes hacer es comprobar el tipo de objeto utilizando la función incorporada type()
:
print(type(print))
numbers = [2, 4, 6, 8]
print(type(numbers.append))
<class 'builtin_function_or_method'>
La salida confirma que el objeto es una función o método incorporado, que es invocable. También hay una función incorporada llamada callable()
que devuelve True
si se puede llamar a su argumento:
print(callable(numbers.append))
True
Otros consejos de depuración a tener en cuenta:
- Comprueba el tipo de paréntesis o corchetes. Las llamadas, como las funciones y los métodos, deben ir seguidas de paréntesis. Los corchetes se utilizan para secuencias, asignaciones y otros objetos subscribibles.
- Busca pistas en el mensaje de error que hagan referencia a funciones o métodos incorporados y objetos subscribibles. El número de línea en los mensajes de error apunta a la línea que contiene el error.
Conclusión
Los lenguajes de programación como Python utilizan marcas diferentes para fines distintos. Los corchetes se utilizan inmediatamente después del nombre de un objeto para acceder a un elemento de la estructura de datos. Esta notación de corchetes funciona con objetos suscribibles. Los corchetes también se utilizan para crear listas cuando no van inmediatamente después del nombre de un objeto.
Los paréntesis se utilizan después del nombre de un objeto para llamarlo. Las funciones y los métodos son ejemplos de objetos invocables en Python. Los paréntesis también están asociados a las tuplas en Python, y se utilizan para agrupar partes de una sentencia cuando es necesario.
Python lanza la excepción 'builtin_function_or_method' object is not subscriptable
cuando una función o método incorporado va seguido de corchetes. La forma correcta de llamar a una función o método es utilizar paréntesis.
Puedes leer más sobre las funciones en el sitio web de DataCamp Funciones de Python: Cómo llamar y escribir funciones.