Razumijevanje Pythonovog sustava tipova ključno je za rješavanje ove nezgodne greške.

Pokušavate dohvatiti podatke iz objekta i umjesto toga vidite pogrešku "objekt se ne može pretplatiti"? Problem je u tome što indeksirate pogrešnu vrstu podataka.

Saznajte sve o vrstama koje se mogu pretplatiti i kako riješiti ovu pogrešku.

Što znači "pretplatiti se" u Pythonu?

Izraz "subscriptable" u Pythonu znači tip podataka koji pohranjuje više vrijednosti kojima možete pristupiti pojedinačno. Možete pristupiti određenoj vrijednosti iz tipa podataka koji se pretpisuje putem njegovog indeksa, koristeći notaciju uglatih zagrada ([]).

Ako pokušate pristupiti stavkama u tipu podataka koji se ne može indeksirati, Python pokreće iznimku "TypeError: object is not subscriptable".

Sljedeći tipovi podataka mogu se pretplatiti u Python: popisi, nizovi, torke i rječnici.

primjer_liste = [1, 3, 5, "Idowu"]
primjer_niza = "Idowu Omisola"
tuple_example = (1, 3, 5, "Idowu")
dict_example = {"Ime": "Idowu", "Jezik": "joruba"}
instagram viewer

print (list_example[0]) # 1
ispis (string_example[3]) # w
ispis (torka_primjer[1]) # 3
ispis (dict_example["Ime"]) # Idowu

Međutim, skupovi, cijeli brojevi, float-ovi i Booleovi, nedostupni su putem indeksiranja, tako da se ne mogu pretplatiti:

float_example = 12.45
int_primjer = 12367
bool_example = Pravi
set_example = {1, 3, 5, "Piton"}

ispis (float_example[1])
ispis (bool_example[2])
ispis (int_example[2])
ispis (set_example[2])

Pokušaj pokretanja svake od ovih izjava daje iznimku "objekt se ne može pretplatiti":

Rješavanje iznimke

Rješavanje iznimke "objekt se ne pretpisuje" lakše je nakon što razumijete pravila za pristup svakoj vrsti podataka. Stoga započnite otklanjanje pogrešaka u Pythonu provjerom tipa podataka objekta koji pokušavate indeksirati.

float_example = 12.45
int_primjer = 12367
bool_example = Pravi
set_example = {1, 3, 5, "Piton"}

ispis (tip (float_example)) #
ispis (tip (int_example)) #
ispis (tip (bool_example)) #
ispis (tip (set_example)) #

Nakon što utvrdite da se tip podataka ne može pretplatiti, pretvaranje u tip koji se može indeksirati rješava problem. Ovo je zgodno ako su podaci iz API treće strane. Pretvaranje tipova podataka kao što su integer, float i Boolean u niz čini ih pretplatljivima:

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

Možete čak manipulirati dobivenim Python nizovima kako želiš. Ako imate posla s cijelim brojem i pomičnim brojem, možda biste željeli zadržati izvorni tip podataka u izlazu. Da biste to učinili, pretvorite dobivenu vrijednost u njihov izvorni tip podataka nakon što ih indeksirate kao nizove:

converted_float = float (str (float_example)[:2])
pretvorena_int = int (str (int_example)[:2])

# 12.0 Vrsta podataka:
ispis (pretvoreno_float, f'Vrsta podataka:{type (converted_float)}')

# 12 Vrsta podataka:
ispis (pretvorena_int, f'Vrsta podataka:{type (converted_int)}')

Što se tiče skupa, možete ga transformirati u popis. Iako skupni objekt možete pretvoriti u popis pomoću popis (set) Python jednolinijski, ovo ne čuva položaje stavki na rezultirajućem popisu. Kako biste bili sigurni da ćete dobiti popis sa sačuvanim položajima stavki, upotrijebite Pythonovu lambda funkciju ovako:

set_example = {1, 3, 5, "Piton"}
pretvoreno = sortirano (set_example, key=lambda x: (je instanca (x, str), x))

ispis (pretvoreno [3]) # Python

Ovladajte otklanjanjem pogrešaka u Pythonu

Python ima glatku krivulju učenja. Ali jednostavne iznimke mogu vas izbaciti ako ne znate kako ih riješiti. Naučiti ispravljati pogreške koda i odvojiti vrijeme za rješavanje problema uvelike pomaže u ispravljanju pogrešaka i iznimaka kodiranja Pythona.