Compreender o sistema de tipos do Python é a chave para resolver esse bug complicado.

Tentando recuperar dados de um objeto e vendo um erro "o objeto não pode ser subscrito"? O problema é que você está indexando o tipo de dados errado.

Descubra tudo sobre tipos subscritos e como resolver esse erro.

O que significa "Subscritível" em Python?

O termo "subscriptable" em Python significa um tipo de dados que armazena vários valores que você pode acessar individualmente. Você pode acessar um valor específico de um tipo de dados subscrito por meio de seu índice, usando a notação de colchetes ([]).

Se você tentar acessar os itens em um tipo de dados que não é indexável, o Python gera uma exceção "TypeError: object is not subscriptable".

Os seguintes tipos de dados são subscritos em Python: listas, strings, tuplas e dicionários.

lista_exemplo = [1, 3, 5, "idowu"]
string_example = "Idowu Omisola"
tupla_exemplo = (1, 3, 5, "idowu")
ditado_exemplo = {"nome": "idowu", "Linguagem": "Iorubá"}

imprimir (lista_exemplo[

0]) # 1
imprimir (string_example[3]) # c
print (tuple_example[1]) # 3
imprimir (dict_example["nome"]) # Idowu

No entanto, conjuntos, inteiros, flutuantes e booleanos são inacessíveis por meio de indexação, portanto, não podem ser subscritos:

float_example = 12.45
int_example = 12367
bool_example = Verdadeiro
set_example = {1, 3, 5, "Pitão"}

imprimir (float_example[1])
imprimir (bool_exemplo[2])
imprimir (int_exemplo[2])
imprimir (conjunto_exemplo[2])

A tentativa de executar cada uma dessas instruções gera a exceção "object is not subscriptable":

Resolvendo a exceção

Resolver a exceção "objeto não pode ser subscrito" é mais fácil quando você entende as regras para acessar cada tipo de dados. Portanto, inicie a depuração do Python verificando o tipo de dados do objeto que você está tentando indexar.

float_example = 12.45
int_example = 12367
bool_example = Verdadeiro
set_example = {1, 3, 5, "Pitão"}

imprimir (tipo (float_example)) #
imprimir (tipo (int_example)) #
imprimir (tipo (bool_example)) #
imprimir (tipo (set_example)) #

Depois de determinar que o tipo de dados não pode ser subscrito, convertê-lo em um tipo indexável resolve o problema. Isso é útil se os dados forem de uma API de terceiros. A conversão de tipos de dados como integer, float e boolean em uma string os torna subscritos:

print (str (float_example)[:2]) # 12
print (str (int_example)[:2]) # 12
print (str (bool_example)[:2]) # Tr

Você também pode manipular as strings Python resultantes como você quiser. Se estiver lidando com integer e float, você pode querer reter o tipo de dados original na saída. Para fazer isso, converta o valor resultante em seu tipo de dados original após indexá-los como strings:

float_convertido = float (str (exemplo_float)[:2])
convert_int = int (str (int_example)[:2])

# 12.0 Tipo de dados:
imprimir (convertido_float, f'Tipo de dados:{type (converted_float)}')

# 12 Tipo de dados:
imprimir (int_convertido, f'Tipo de dados:{tipo (converted_int)}')

Quanto a um conjunto, você pode transformá-lo em uma lista. Embora você possa converter um objeto definido em uma lista usando o lista (conjunto) Python one-liner, isso não preserva as posições dos itens na lista resultante. Para garantir que você obtenha uma lista com posições de itens preservadas, use a função lambda do Python da seguinte forma:

set_example = {1, 3, 5, "Pitão"}
convertido = classificado (set_example, key=lambda x: (isinstance (x, str), x))

imprimir (convertido[3]) # Pitão

Depuração mestre do Python

Python tem uma curva de aprendizado suave. Mas exceções simples podem despistá-lo se você não souber como resolvê-las. Aprender a depurar seu código e tomar seu tempo com a solução de problemas ajuda muito a corrigir erros e exceções de codificação do Python.