Pochopení typového systému Pythonu je klíčem k vyřešení této záludné chyby.

Pokoušíte se načíst data z objektu a místo toho vidíte chybu „objekt není zapisovatelný“? Problém je v tom, že indexujete nesprávný datový typ.

Zjistěte vše o přepisovatelných typech a o tom, jak tuto chybu vyřešit.

Co znamená „Subscriptable“ v Pythonu?

Termín "subscriptable" v Pythonu znamená datový typ, který ukládá více hodnot, ke kterým můžete přistupovat jednotlivě. Ke konkrétní hodnotě z indexovatelného datového typu můžete přistupovat prostřednictvím jeho indexu pomocí zápisu hranatých závorek ([]).

Pokud se pokusíte získat přístup k položkám v datovém typu, který není indexovatelný, Python vyvolá výjimku "TypeError: objekt není indexovatelný".

V Pythonu lze indexovat následující datové typy: seznamy, řetězce, n-tice a slovníky.

příklad_seznamu = [1, 3, 5, "Idowu"]
string_example = "Idowu Omisola"
příklad_n-tice = (1, 3, 5, "Idowu")
dict_example = {"název": "Idowu", "Jazyk": "joruba"}

tisknout (příklad_seznamu[0])

instagram viewer
# 1
tisknout (řetězec_příklad[3]) # w
tisknout (tuple_example[1]) # 3
tisknout (dict_example["název"]) #Idowu

Sady, celá čísla, pohyblivá čísla a booleovské hodnoty jsou však nepřístupné přes indexování, takže je nelze indexovat:

float_example = 12.45
int_example = 12367
bool_example = Skutečný
set_example = {1, 3, 5, "Krajta"}

tisknout (plovoucí_příklad[1])
tisknout (bool_example[2])
tisknout (int_example[2])
tisknout (set_example[2])

Při pokusu o spuštění každého z těchto příkazů se objeví výjimka "objekt není indexovatelný":

Řešení výjimky

Vyřešení výjimky „objekt není zapisovatelný“ je snazší, jakmile pochopíte pravidla pro přístup ke každému datovému typu. Začněte tedy ladění Pythonu kontrolou datového typu objektu, který se pokoušíte indexovat.

float_example = 12.45
int_example = 12367
bool_example = Skutečný
set_example = {1, 3, 5, "Krajta"}

tisknout (type (float_example)) #
tisknout (typ (int_example)) #
tisknout (typ (bool_example)) #
print (type (set_example)) #

Jakmile zjistíte, že datový typ nelze přepisovat, jeho převod na indexovatelný typ problém vyřeší. To je užitečné, pokud jsou data z API třetí strany. Převod datových typů, jako je integer, float a Boolean, na řetězec je činí indexovatelnými:

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

Můžete dokonce manipulovat s výslednými řetězci Pythonu jak chceš. Pokud pracujete s integer a float, možná budete chtít zachovat původní datový typ ve výstupu. Chcete-li to provést, převeďte výslednou hodnotu na původní datový typ poté, co je indexujete jako řetězce:

convert_float = float (str (float_example)[:2])
convert_int = int (str (int_example)[:2])

# 12.0 Typ dat:
tisknout (converted_float, f'Datový typ:{type (converted_float)}')

# 12 Typ dat:
tisknout (converted_int, f'Datový typ:{type (converted_int)}')

Pokud jde o sadu, můžete ji přeměnit na seznam. Ačkoli můžete převést objekt sady na seznam pomocí seznam (set) Python one-liner, toto nezachová pozice položek ve výsledném seznamu. Chcete-li zajistit, že získáte seznam se zachovanými pozicemi položek, použijte funkci lambda Pythonu takto:

set_example = {1, 3, 5, "Krajta"}
převedeno = seřazeno (set_example, key=lambda x: (isinstance (x, str), x))

tisknout (převedeno[3]) # Python

Ovládněte ladění Pythonu

Python má hladkou křivku učení. Ale jednoduché výjimky vás mohou rozhodit, pokud nevíte, jak se s nimi vypořádat. Naučit se ladit svůj kód a věnovat čas řešení problémů znamená dlouhou cestu k opravě chyb a výjimek v kódování Pythonu.