Het begrijpen van het typesysteem van Python is de sleutel tot het oplossen van deze lastige bug.

Probeert u gegevens van een object op te halen en ziet u in plaats daarvan een fout "object is niet subscriptable"? Het probleem is dat u het verkeerde gegevenstype indexeert.

Lees alles over abonnementstypen en hoe u deze fout kunt oplossen.

Wat betekent "Abonneerbaar" in Python?

De term "subscriptable" in Python betekent een gegevenstype dat meerdere waarden opslaat waartoe u afzonderlijk toegang hebt. U kunt toegang krijgen tot een specifieke waarde van een subscripteerbaar gegevenstype via de index, met behulp van de notatie tussen vierkante haken ([]).

Als u toegang probeert te krijgen tot de items in een gegevenstype dat niet kan worden geïndexeerd, genereert Python een uitzondering "TypeError: object is niet subscriptable".

De volgende gegevenstypen zijn subscriptable in Python: lijsten, strings, tuples en woordenboeken.

lijst_voorbeeld = [1, 3, 5, "Idowu"]
tekenreeks_voorbeeld = "Idowu Omisola"
tuple_example = (1, 3, 5, "Idowu")
dict_example = {"naam": "Idowu", "Taal": "Yoruba"}

afdrukken (lijst_voorbeeld[0]) # 1
print (tekenreeks_voorbeeld[3]) # w
afdrukken (tuple_example[1]) # 3
afdrukken (dict_example["naam"]) # Idou

Sets, integers, floats en Booleans zijn echter niet toegankelijk via indexering, dus ze kunnen niet worden gesubscripteerd:

float_voorbeeld = 12.45
int_voorbeeld = 12367
bool_voorbeeld = WAAR
set_voorbeeld = {1, 3, 5, "Python"}

afdrukken (float_example[1])
afdrukken (bool_voorbeeld[2])
afdrukken (int_voorbeeld[2])
afdrukken (set_voorbeeld[2])

Als u probeert elk van deze instructies uit te voeren, wordt de uitzondering "object is niet subscriptable" uitgevoerd:

De uitzondering oplossen

Het oplossen van de uitzondering "object kan niet worden gesubscripteerd" is eenvoudiger als u eenmaal de regels voor toegang tot elk gegevenstype begrijpt. Dus begin uw Python-foutopsporing door het gegevenstype te controleren van het object dat u probeert te indexeren.

float_voorbeeld = 12.45
int_voorbeeld = 12367
bool_voorbeeld = WAAR
set_voorbeeld = {1, 3, 5, "Python"}

afdrukken (typ (float_example)) #
afdrukken (typ (int_voorbeeld)) #
afdrukken (type (bool_voorbeeld)) #
afdrukken (type (set_voorbeeld)) #

Zodra u hebt vastgesteld dat het gegevenstype niet kan worden gesubscripteerd, wordt het probleem opgelost door het te converteren naar een indexeerbaar type. Dit is handig als de gegevens afkomstig zijn van een externe API. Door gegevenstypen zoals integer, float en Boolean om te zetten in een tekenreeks, kunnen ze worden gesubscripteerd:

afdrukken (str (float_example)[:2]) # 12
afdrukken (str (int_voorbeeld)[:2]) # 12
afdrukken (str (bool_voorbeeld)[:2]) #Tr

Je kan zelfs manipuleer de resulterende Python-strings zoals je wilt. Als u te maken heeft met integer en float, wilt u misschien het oorspronkelijke gegevenstype in de uitvoer behouden. Om dit te doen, converteert u de resulterende waarde naar hun oorspronkelijke gegevenstype nadat u ze als tekenreeksen hebt geïndexeerd:

geconverteerde_float = float (str (float_example)[:2])
geconverteerde_int = int (str (int_voorbeeld)[:2])

# 12.0 Gegevenstype:
afdrukken (converted_float, f'Gegevenstype:{type (converted_float)}')

# 12 Gegevenstype:
afdrukken (geconverteerde_int, f'Gegevenstype:{type (geconverteerde_int)}')

Wat een set betreft, u kunt deze omzetten in een lijst. Hoewel u een ingesteld object naar een lijst kunt converteren met behulp van de lijst (set) Python one-liner, hierdoor blijven de itemposities in de resulterende lijst niet behouden. Gebruik Python's lambda-functie als volgt om ervoor te zorgen dat u een lijst krijgt met bewaarde itemposities:

set_voorbeeld = {1, 3, 5, "Python"}
geconverteerd = gesorteerd (set_example, key=lambda x: (isinstantie (x, str), x))

afdrukken (geconverteerd[3]) #python

Beheers Python-foutopsporing

Python heeft een soepele leercurve. Maar simpele uitzonderingen kunnen je afschrikken als je niet weet hoe je ze moet aanpakken. Door je code te leren debuggen en je tijd te nemen met het oplossen van problemen, kun je veel codeerfouten en uitzonderingen in Python oplossen.