Curso
Em Python, uma mensagem de erro comum é a seguinte:
'builtin_function_or_method' object is not subscriptable
O Python gera esse erro quando uma função ou método é seguido pela notação []
entre colchetes. No entanto, as funções são objetos que podem ser chamados. Portanto, eles exigem parênteses ()
, que às vezes também são chamados de colchetes.
Vamos dar uma olhada em um exemplo em que o Python apresenta esse erro:
numbers = [2, 4, 6, 8]
numbers.append[10]
Traceback (most recent call last):
...
TypeError: 'builtin_function_or_method' object is not subscriptable
A seção a seguir explora esse erro em mais detalhes.
Entendendo o erro
As funções do Python são objetos que podem ser chamados, o que significa que podemos usar parênteses após o nome da função para executar o código na definição da função. Um dos exemplos mais comuns de uma função integrada em Python é print()
:
print("This is a built-in function")
This is a built-in function
Os parênteses são usados para chamar uma função em Python. No entanto, o uso de colchetes em vez de parênteses gera um erro:
print["This is a built-in function"]
Traceback (most recent call last):
...
TypeError: 'builtin_function_or_method' object is not subscriptable
Vamos dividir a mensagem de erro em suas partes principais:
- Um objeto "builtin_function_or_method".
- Não subscritível
No exemplo acima, print()
é uma função incorporada. A descrição também se refere a métodos, que são funções que fazem parte de uma classe. O Python tem muitos métodos internos associados a seus tipos de dados. Vamos dar uma olhada em outro exemplo que gera essa mensagem de erro:
name = "DataCamp"
print(name.count["a"])
Traceback (most recent call last):
...
TypeError: 'builtin_function_or_method' object is not subscriptable
O método .count()
, assim como as funções em geral, precisa de parênteses:
print(name.count("a"))
3
Esse cenário é semelhante ao exemplo da introdução, que contém o método de lista .append()
. Aqui está a versão correta usando parênteses:
numbers = [2, 4, 6, 8]
numbers.append(10)
print(numbers)
[2, 4, 6, 8, 10]
TypeError: o objeto 'function' não é subscritível
O Python apresenta um erro semelhante com funções definidas pelo usuário:
def greet_person(name):
print(f"Hello {person}")
greet_person["James"]
Traceback (most recent call last):
...
TypeError: 'function' object is not subscriptable
No entanto, a função greet_person()
não é uma das funções internas do Python. A mensagem de erro afirma que se trata de uma "função" em vez de um "builtin_function_or_method".
A segunda parte da mensagem de erro refere-se ao termo "subscriptable". Um objeto Python é subscritível se pudermos usar colchetes para acessar um de seus elementos. Um exemplo comum de um objeto subscritível é uma sequênciaque pode ser indexada usando colchetes:
print(numbers[0])
print(numbers[-1])
print(numbers[1:4])
2
10
[4, 6, 8]
Tuplas e cadeias de caracteres são outros exemplos de sequências. Portanto, eles também são subscritíveis:
more_numbers = 10, 30, 50
print(more_numbers[0])
name = "DataCamp"
print(name[0])
10
'D'
Python mapeamentos também são subscritíveis. O mapeamento mais comum em Python é o dicionário:
points = {"James": 10, "Mary": 14}
print(points["Mary"])
14
As chaves do dicionário são usadas em vez de índices entre colchetes.
Python: Chamável vs. Subscritível
Sequências e mapeamentos são exemplos de objetos Python subscritíveis. Você pode usar colchetes após o nome do objeto para acessá-lo a partir da estrutura de dados. Uma classe Python cria objetos subscritíveis se você definir o método especial .__getitem__()
.
Funções e métodos são exemplos de objetos chamáveis. Podemos usar parênteses após o nome do objeto para chamá-los. A chamada de uma função ou método executa o código na definição da função.
As classes são outro objeto Python que você pode chamar. Ao chamar uma classe, você cria uma instância. Em geral, um objeto Python é chamável se sua classe definir o método especial .__call__()
.
O Python exibe uma mensagem de erro semelhante quando você tenta chamar um objeto que não pode ser chamado:
numbers = [2, 4, 6, 8]
print(numbers(0))
Traceback (most recent call last):
...
TypeError: 'list' object is not callable
A variável numbers
é uma lista, que não pode ser chamada. A maneira correta de acessar o primeiro item da lista é usar colchetes: numbers[0]
. Funções, métodos e classes são os objetos chamáveis mais comuns em Python.
Correção: o objeto 'builtin_function_or_method' não é subscritível`
O Python gera a mensagem de erro ``O objeto builtin_function_or_method' não é subscritível`` quando uma função ou método é seguido por colchetes. Observe se há colchetes logo após o nome da função ou do método e substitua-os por parênteses.
Em alguns casos, uma função ou método tem uma lista como argumento, que é definida usando colchetes. No entanto, observe que a lista é definida entre parênteses:
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]
Nesses exemplos, o nome da função ou do método é seguido por parênteses. O argumento entre parênteses é uma lista. A notação de colchetes para definir uma lista é diferente da notação de colchetes usada com sequências, mapeamentos e outros objetos subscritíveis.
Dicas de depuração
Uma coisa que você pode fazer é verificar o tipo de objeto usando a função integrada type()
:
print(type(print))
numbers = [2, 4, 6, 8]
print(type(numbers.append))
<class 'builtin_function_or_method'>
O resultado confirma que o objeto é uma função ou método interno, que pode ser chamado. Há também uma função interna chamada callable()
que retorna True
se seu argumento puder ser chamado:
print(callable(numbers.append))
True
Outras dicas de depuração que você deve considerar:
- Verifique o tipo de colchetes ou parênteses. Os chamáveis, como funções e métodos, precisam ser seguidos por parênteses. Os colchetes são usados para sequências, mapeamentos e outros objetos subscritíveis.
- Procure pistas na mensagem de erro referentes a funções ou métodos incorporados e objetos subscritíveis. O número da linha nas mensagens de erro aponta para a linha que contém o erro.
Conclusão
Linguagens de programação como Python usam marcas diferentes para propósitos distintos. Os colchetes são usados imediatamente após o nome de um objeto para acessar um elemento da estrutura de dados. Essa notação de colchetes funciona em objetos subscritíveis. Os colchetes também são usados para criar listas quando não são seguidos imediatamente após o nome de um objeto.
Os parênteses são usados após o nome de um objeto para chamá-lo. Funções e métodos são exemplos de objetos chamáveis em Python. Os parênteses também estão associados a tuplas no Python e são usados para agrupar partes de uma declaração quando necessário.
O Python levanta a exceção 'builtin_function_or_method' object is not subscriptable
quando uma função ou método incorporado é seguido por colchetes. A maneira correta de chamar uma função ou método é usar parênteses.
Você pode ler mais sobre funções no site da DataCamp Funções Python: Como chamar e escrever funções.