Jakie typy obiektów należą do dziedziny „podlegającej indeksacji”?
python
terminology
Alistair
źródło
źródło
hasattr(SomeClassWithoutGetItem, '__getitem__')
ustalenie, czy dana rzecz podlega indeksowi?[
...]
Składnia indeksowania jest nazywany indeks , ponieważ jest to równoznaczne z notacją matematyczną, która używa rzeczywistych indeksów; np.a[1]
jest Python dla tego, co matematyk napisaliby jako a₁ . Zatem „indeksowalny” oznacza „możliwy do indeksowania”. Co, w kategoriach Python, oznacza, że musi się zaimplementować__getitem__()
, ponieważa[1]
jest to po prostu cukier syntaktycznya.__getitem__(1)
.hasattr
powinno działać dobrze, ale nie jest to Pythoński sposób robienia rzeczy; Praktyka w Pythonie zachęca do pisania kaczek . Oznacza to, że jeśli zamierzasz pobrać element ze swojego obiektu za pomocą indeksu dolnego, zrób to; jeśli uważasz, że to może nie działać, ponieważ obiekt nie podlega indeksowi, zawiń go wtry
bloku za pomocąexcept TypeError
.Z góry mojej głowy, następujące są jedyne wbudowane, które można subskrybować:
Ale odpowiedź mipadi jest poprawna - każda klasa, która implementuje,
__getitem__
podlega indeksowiźródło
Skryptowy obiekt to obiekt, który rejestruje wykonane na nim operacje i może przechowywać je jako „skrypt”, który można odtworzyć.
Na przykład zobacz: Framework skryptów aplikacji
Teraz, jeśli Alistair nie wiedział, o co pytał, i naprawdę miał na myśli obiekty „podlegające indeksacji” (edytowane przez innych), to (jak odpowiedziała również mipadi) jest to poprawny:
Obiektem do indeksowania jest każdy obiekt, który implementuje
__getitem__
specjalną metodę (listy myśli, słowniki).źródło
Znaczenie indeksu dolnego w obliczeniach to: „symbol (teoretycznie zapisany jako indeks dolny, ale w praktyce zwykle nie jest) używany w programie, samodzielnie lub z innymi, w celu określenia jednego z elementów tablicy”.
Teraz w prostym przykładzie podanym przez @ user2194711 możemy zobaczyć, że element dołączający nie może być częścią listy z dwóch powodów: -
1) Tak naprawdę nie nazywamy metody append; ponieważ trzeba
()
to nazwać.2) Błąd wskazuje, że funkcja lub metoda nie podlega indeksowi; oznacza, że nie można ich indeksować jak listy lub sekwencji.
Zobacz teraz: -
Oznacza to, że nie ma indeksów dolnych ani elementów mówionych
function
tak, jakby występowały sekwencyjnie; i nie możemy uzyskać do nich dostępu tak jak my, z pomocą[]
.Również; jak powiedział mipadi w swojej odpowiedzi; Zasadniczo oznacza to, że obiekt implementuje
__getitem__()
metodę. (jeśli można go subskrybować). W ten sposób wystąpił błąd:źródło
Miałem ten sam problem. ja robiłem
Używanie
[
powodowało błąd. Powinno byćarr.append("HI")
źródło
W związku z wcześniejszymi odpowiedziami tutaj bardzo często jest to znak, że uważasz, że masz listę (lub dyktowanie, lub inny obiekt podlegający indeksacji), gdy tego nie robisz.
Załóżmy na przykład, że masz funkcję, która powinna zwrócić listę;
Teraz, kiedy wywołujesz tę funkcję i
something_happens()
z jakiegoś powodu nie zwracaTrue
wartości, co się dzieje?if
Nie powiedzie się, a więc upadniesz poprzez;gimme_things
nie mareturn
nic jawnego - więc w rzeczywistości będzie to domyślnie niejawnereturn None
. Następnie ten kod:zakończy się niepowodzeniem, gdy „
NoneType
obiekt nie podlega indeksowi”, ponieważ, cóż,things
jest,None
więc próbujesz zrobić to,None[0]
co nie ma sensu, ponieważ ... co mówi komunikat o błędzie.Istnieją dwa sposoby naprawienia tego błędu w kodzie - pierwszy polega na uniknięciu błędu poprzez sprawdzenie, czy
things
jest poprawny przed próbą jego użycia;lub równoważnie wyłapać
TypeError
wyjątek;Innym jest przeprojektowanie
gimme_things
, aby upewnić się, że zawsze zwraca listę. W tym przypadku jest to prawdopodobnie prostsza konstrukcja, ponieważ oznacza to, że jeśli istnieje wiele miejsc, w których występuje podobny błąd, można je zachować w prosty i idiomatyczny sposób.Oczywiście to, co umieścisz w
else:
gałęzi, zależy od przypadku użycia. Być może powinieneś poruszyć wyjątek, gdysomething_happens()
zawiedzie, aby uczynić go bardziej oczywistym i wyraźnym, gdy coś rzeczywiście poszło nie tak? Dodanie wyjątków do własnego kodu jest ważnym sposobem, aby dowiedzieć się dokładnie, co się dzieje, gdy coś zawiedzie!(Zauważmy też, jak ta ostatnia poprawka jeszcze nie całkowicie naprawić błąd - to uniemożliwia próby indeksu
None
, alethings[0]
jest nadalIndexError
, gdythings
jest pusta lista Jeśli masz.try
Można zrobićexcept (TypeError, IndexError)
pułapkę, too.)źródło