At forstå Pythons typesystem er nøglen til at løse denne vanskelige fejl.

Forsøger du at hente data fra et objekt og ser i stedet fejlen "objekt kan ikke abonneres"? Problemet er, at du indekserer den forkerte datatype.

Find ud af alt om abonnenttyper, og hvordan du løser denne fejl.

Hvad betyder "Subscriptable" i Python?

Udtrykket "subscriptable" i Python betyder en datatype, der gemmer flere værdier, som du kan få adgang til individuelt. Du kan få adgang til en specifik værdi fra en abonnent datatype via dens indeks ved at bruge firkantet parentes ([]) notation.

Hvis du forsøger at få adgang til elementerne i en datatype, der ikke kan indekseres, frembringer Python undtagelsen "TypeError: objekt kan ikke abonneres".

Følgende datatyper kan abonneres i Python: lister, strenge, tupler og ordbøger.

liste_eksempel = [1, 3, 5, "Idowu"]
streng_eksempel = "Idowu Omisola"
tuple_example = (1, 3, 5, "Idowu")
dikt_eksempel = {"navn": "Idowu", "Sprog": "Yoruba"}

print (liste_eksempel[0]) # 1
print (streng_eksempel[3]) # w
print (tuple_example[1]) # 3
print (dikt_eksempel["navn"]) #Idowu

instagram viewer

Men sæt, heltal, flydere og booleaner er utilgængelige via indeksering, så de kan ikke abonneres:

float_example = 12.45
int_eksempel = 12367
bool_eksempel = Rigtigt
sæt_eksempel = {1, 3, 5, "Python"}

print (float_example[1])
print (bool_eksempel[2])
print (int_example[2])
print (sæt_eksempel[2])

Forsøg på at køre hver af disse sætninger udsender undtagelsen "objekt kan ikke abonneres":

Løsning af undtagelsen

Det er nemmere at løse undtagelsen "objekt kan ikke abonneres", når du først forstår reglerne for adgang til hver datatype. Så start din Python-fejlretning ved at kontrollere datatypen for det objekt, du forsøger at indeksere.

float_example = 12.45
int_eksempel = 12367
bool_eksempel = Rigtigt
sæt_eksempel = {1, 3, 5, "Python"}

print (type (float_example)) #
print (type (int_example)) #
print (type (bool_example)) #
print (type (sæt_eksempel)) #

Når du har fundet ud af, at datatypen ikke kan abonneres, løser problemet problemet ved at konvertere den til en indekserbar type. Dette er praktisk, hvis data er fra en tredjeparts API. Konvertering af datatyper som heltal, float og Boolean til en streng gør dem til at abonnere:

print (str (float_example)[:2]) # 12
print (str (int_eksempel)[:2]) # 12
print (str (bool_eksempel)[:2]) # Tr

Du kan endda manipulere de resulterende Python-strenge som du vil. Hvis du har at gøre med heltal og float, vil du måske beholde den originale datatype i outputtet. For at gøre dette skal du konvertere den resulterende værdi til deres oprindelige datatype efter at have indekseret dem som strenge:

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

# 12.0 Datatype:
print (converted_float, f'Data type:{type (converted_float)}')

#12 Datatype:
print (konverteret_int, f'Data type:{type (converted_int)}')

Hvad angår et sæt, kan du omdanne det til en liste. Selvom du kan konvertere et sæt objekt til en liste ved hjælp af liste (sæt) Python one-liner, dette bevarer ikke emnepositionerne i den resulterende liste. For at sikre, at du får en liste med bevarede elementpositioner, skal du bruge Pythons lambda-funktion sådan:

sæt_eksempel = {1, 3, 5, "Python"}
konverteret = sorteret (sæt_eksempel, nøgle=lambda x: (isinstans (x, str), x))

print (konverteret[3]) # Python

Master Python Debugging

Python har en jævn indlæringskurve. Men simple undtagelser kan kaste dig ud, hvis du ikke ved, hvordan du skal tackle dem. At lære at debugge din kode og tage dig tid til problemløsning er en lang vej til at rette Python-kodningsfejl og undtagelser.