Att förstå Pythons typsystem är nyckeln till att lösa denna knepiga bugg.
Försöker du hämta data från ett objekt och ser ett "objekt kan inte tecknas"-fel istället? Problemet är att du indexerar fel datatyp.
Ta reda på allt om abonnemangstyper och hur du löser detta fel.
Vad betyder "Subscriptable" i Python?
Termen "subscriptable" i Python betyder en datatyp som lagrar flera värden som du kan komma åt individuellt. Du kan komma åt ett specifikt värde från en abonnemangsbar datatyp via dess index, med hakparentes ([]).
Om du försöker komma åt objekten i en datatyp som inte är indexerbar, skapar Python undantaget "TypeError: object is not subscriptable".
Följande datatyper kan tecknas i Python: listor, strängar, tupler och ordböcker.
list_example = [1, 3, 5, "Idowu"]
string_example = "Idowu Omisola"
tuple_example = (1, 3, 5, "Idowu")
dict_example = {"namn": "Idowu", "Språk": "Yoruba"}
print (lista_exempel[0]) # 1
print (sträng_exempel[3]) # w
print (tuppel_exempel[1]) # 3
print (dict_example["namn"]) # Idowu
Uppsättningar, heltal, flytande tal och booleaner är dock otillgängliga via indexering, så de går inte att teckna:
float_example = 12.45
int_example = 12367
bool_example = Sann
set_example = {1, 3, 5, "Pytonorm"}
print (float_example[1])
print (bool_example[2])
print (int_example[2])
print (set_example[2])
Ett försök att köra var och en av dessa satser ger undantaget "objekt kan inte tecknas":
Lösning av undantaget
Det är lättare att lösa undantaget "objekt kan inte tecknas" när du förstår reglerna för åtkomst till varje datatyp. Så börja din Python-felsökning genom att kontrollera datatypen för objektet du försöker indexera.
float_example = 12.45
int_example = 12367
bool_example = Sann
set_example = {1, 3, 5, "Pytonorm"}
print (typ (float_example)) #
print (typ (int_example)) #
print (typ (bool_example)) #
print (typ (set_example)) #
När du har fastställt att datatypen inte är abonnemang, löser problemet problemet genom att konvertera den till en indexerbar typ. Detta är praktiskt om data kommer från ett tredjeparts-API. Att konvertera datatyper som heltal, float och booleskt till en sträng gör att de kan tecknas:
print (str (float_example)[:2]) # 12
print (str (int_example)[:2]) # 12
print (str (bool_exempel)[:2]) # Tr
Du kan till och med manipulera de resulterande Python-strängarna som du vill. Om du har att göra med heltal och float kanske du vill behålla den ursprungliga datatypen i utdata. För att göra detta, konvertera det resulterande värdet till deras ursprungliga datatyp efter att ha indexerat dem som strängar:
converted_float = float (str (float_example)[:2])
converted_int = int (str (int_example)[:2])# 12.0 Datatyp:
print (converted_float, f'Datatyp:{typ (converted_float)}')
# 12 Datatyp:
print (converted_int, f'Datatyp:{typ (converted_int)}')
När det gäller en uppsättning kan du omvandla den till en lista. Även om du kan konvertera ett uppsättningsobjekt till en lista med hjälp av lista (uppsättning) Python one-liner, detta bevarar inte objektpositionerna i den resulterande listan. För att säkerställa att du får en lista med bevarade objektpositioner, använd Pythons lambda-funktion så här:
set_example = {1, 3, 5, "Pytonorm"}
konverterad = sorterad (set_exempel, nyckel=lambda x: (isinstans (x, str), x))
print (konverterad[3]) # Python
Master Python Debugging
Python har en smidig inlärningskurva. Men enkla undantag kan störa dig om du inte vet hur du ska tackla dem. Att lära sig att felsöka din kod och ta dig tid med problemlösning räcker långt för att fixa Python-kodningsfel och undantag.