Norint išspręsti šią sudėtingą klaidą, labai svarbu suprasti Python tipo sistemą.

Bandote gauti duomenis iš objekto ir matote klaidą „Objektas neprenumeruojamas“? Problema ta, kad indeksuojate netinkamo tipo duomenis.

Sužinokite viską apie prenumeruojamus tipus ir kaip išspręsti šią klaidą.

Ką Python reiškia „prenumeruojamas“?

„Python“ terminas „prenumeruojamas“ reiškia duomenų tipą, kuriame saugomos kelios reikšmės, kurias galite pasiekti atskirai. Galite pasiekti konkrečią vertę iš prenumeruojamo duomenų tipo per indeksą, naudodami laužtinius skliaustus ([]).

Jei bandote pasiekti elementus, kurių duomenų tipas nėra indeksuojamas, „Python“ pateikia išimtį „TypeError: objekto negalima prenumeruoti“.

Python programoje galima prenumeruoti šiuos duomenų tipus: sąrašus, eilutes, eilutes ir žodynus.

list_example = [1, 3, 5, "Idowu"]
string_example = "Idowu Omisola"
tuple_example = (1, 3, 5, "Idowu")
dict_example = {"vardas": "Idowu", "Kalba": "Joruba"}

spausdinti (list_example[0]) # 1
spausdinti (string_example[3]) # w
spausdinti (tuple_example[1]) # 3
spausdinti (dict_example["vardas"]) # Idowu

instagram viewer

Tačiau rinkiniai, sveikieji skaičiai, plūdiniai skaičiai ir Būlio vertės nepasiekiami indeksuojant, todėl jų negalima prenumeruoti:

float_example = 12.45
int_example = 12367
bool_example = Tiesa
set_example = {1, 3, 5, "Python"}

print (float_example[1])
spausdinti (bool_example[2])
spausdinti (int_example[2])
spausdinti (set_example[2])

Bandant paleisti kiekvieną iš šių teiginių, išvedama išimtis „objektas neprenumeruojamas“:

Išimties sprendimas

Išspręsti išimtį „Objektas neprenumeruojamas“ yra lengviau, kai suprantate kiekvieno duomenų tipo prieigos taisykles. Taigi pradėkite „Python“ derinimą patikrindami objekto, kurį bandote indeksuoti, duomenų tipą.

float_example = 12.45
int_example = 12367
bool_example = Tiesa
set_example = {1, 3, 5, "Python"}

spausdinti (tipas (float_example)) #
spausdinti (tipas (int_example)) #
spausdinti (tipas (bool_example)) #
spausdinti (tipas (set_example)) #

Nustačius, kad duomenų tipas nėra prenumeruojamas, pakeitus jį į indeksuojamą tipą, problema išspręsta. Tai patogu, jei duomenys yra iš trečiosios šalies API. Duomenų tipus, tokius kaip sveikasis skaičius, float ir Būlio vertė, konvertavus į eilutę, juos galima prenumeruoti:

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

Jūs netgi galite manipuliuoti gautomis Python eilutėmis kaip jūs norite. Jei dirbate su sveikuoju skaičiumi ir plūduriuojančiu skaičiumi, galbūt norėsite išsaugoti pradinį duomenų tipą išvestyje. Norėdami tai padaryti, konvertuokite gautą reikšmę į pradinį duomenų tipą, indeksavę juos kaip eilutes:

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

# 12.0 Duomenų tipas:
print (converted_float, f'Duomenų tipas:{tipas (converted_float)}')

# 12 Duomenų tipas:
spausdinti (converted_int, f'Duomenų tipas:{tipas (converted_int)}')

Kalbant apie rinkinį, galite jį paversti sąrašu. Nors nustatyti objektą galite konvertuoti į sąrašą naudodami sąrašas (rinkinys) Python vienos eilutės eilutė, tai neišsaugo elementų pozicijų gautame sąraše. Norėdami užtikrinti, kad gausite sąrašą su išsaugotomis elementų pozicijomis, naudokite Python lambda funkciją taip:

set_example = {1, 3, 5, "Python"}
konvertuota = surūšiuota (set_example, key=lambda x: (instance (x, str), x))

spausdinti (konvertuotas[3]) # Python

Pagrindinis Python derinimas

Python turi sklandžią mokymosi kreivę. Tačiau paprastos išimtys gali jus išgąsdinti, jei nežinote, kaip jas spręsti. Išmokus derinti kodą ir neskubant sprendžiant problemas, labai padeda ištaisyti Python kodavimo klaidas ir išimtis.