Å forstå Pythons typesystem er nøkkelen til å løse denne vanskelige feilen.
Prøver du å hente data fra et objekt og ser en "objekt kan ikke registreres"-feil i stedet? Problemet er at du indekserer feil datatype.
Finn ut alt om abonnenttyper og hvordan du løser denne feilen.
Hva betyr "Subscriptable" i Python?
Begrepet "subscriptable" i Python betyr en datatype som lagrer flere verdier som du kan få tilgang til individuelt. Du kan få tilgang til en spesifikk verdi fra en abonnentbar datatype via dens indeks, ved å bruke firkantklammer ([]) notasjon.
Hvis du prøver å få tilgang til elementene i en datatype som ikke er indekserbar, reiser Python et "TypeError: object is not subscriptable"-unntak.
Følgende datatyper kan abonneres i Python: lister, strenger, tuples og ordbøker.
liste_eksempel = [1, 3, 5, "Idowu"]
string_example = "Idowu Omisola"
tuple_example = (1, 3, 5, "Idowu")
dikt_eksempel = {"Navn": "Idowu", "Språk": "Yoruba"}
print (liste_eksempel[0]) # 1
print (streng_eksempel[3]) # w
print (tuppel_eksempel[1]) # 3
print (dikteksempel["Navn"]) #Idowu
Imidlertid er sett, heltall, flyter og boolske tall utilgjengelige via indeksering, så de kan ikke abonneres:
flyteeksempel = 12.45
int_example = 12367
bool_example = ekte
set_example = {1, 3, 5, "Python"}
print (float_example[1])
print (bool_example[2])
print (int_example[2])
print (sett_eksempel[2])
Et forsøk på å kjøre hver av disse setningene gir unntaket "objektet kan ikke abonneres":
Løsning av unntaket
Å løse unntaket "objekt kan ikke abonneres" er lettere når du forstår reglene for tilgang til hver datatype. Så start Python-feilsøkingen ved å sjekke datatypen til objektet du prøver å indeksere.
flyteeksempel = 12.45
int_example = 12367
bool_example = ekte
set_example = {1, 3, 5, "Python"}
print (type (float_example)) #
print (type (int_example)) #
print (type (bool_example)) #
print (type (sett_eksempel)) #
Når du har funnet ut at datatypen ikke kan abonneres, løser problemet problemet ved å konvertere den til en indekserbar type. Dette er nyttig hvis dataene er fra en tredjeparts API. Konvertering av datatyper som heltall, float og boolsk til en streng gjør dem abonnerbare:
print (str (float_example)[:2]) # 12
print (str (int_example)[:2]) # 12
print (str (bool_example)[:2]) # Tr
Du kan til og med manipulere de resulterende Python-strengene som du vil. Hvis du har å gjøre med heltall og float, vil du kanskje beholde den opprinnelige datatypen i utdataene. For å gjøre dette, konverter den resulterende verdien til den opprinnelige datatypen etter å ha indeksert dem som strenger:
converted_float = float (str (float_example)[:2])
converted_int = int (str (int_example)[:2])# 12.0 Datatype:
print (converted_float, f'Datatype:{type (converted_float)}')
# 12 Datatype:
print (konvertert_int, f'Datatype:{type (converted_int)}')
Når det gjelder et sett, kan du forvandle det til en liste. Selv om du kan konvertere et sett objekt til en liste ved å bruke liste (sett) Python one-liner, dette bevarer ikke elementposisjonene i den resulterende listen. For å sikre at du får en liste med bevarte elementposisjoner, bruk Pythons lambda-funksjon slik:
set_example = {1, 3, 5, "Python"}
konvertert = sortert (setteksempel, nøkkel=lambda x: (isinstance (x, str), x))
print (konvertert[3]) # Python
Master Python Debugging
Python har en jevn læringskurve. Men enkle unntak kan kaste deg ut hvis du ikke vet hvordan du skal takle dem. Å lære å feilsøke koden din og ta deg tid til problemløsning går langt for å fikse Python-kodingsfeil og unntak.