DedSec Project

IndexError — DedSec Project

IndexError: έλεγξε τα όρια χωρίς να κρύβεις σφάλματα Τι συμβαίνει και πότε Το IndexError δείχνει προσπέλαση εκτός ορίων ακολουθίας. Οι μη αρνητικές θέσεις είναι από 0 έως len(items)-1· οι…

IndexError: έλεγξε τα όρια χωρίς να κρύβεις σφάλματα

Τι συμβαίνει και πότε

Το IndexError δείχνει προσπέλαση εκτός ορίων ακολουθίας. Οι μη αρνητικές θέσεις είναι από 0 έως len(items)-1· οι αρνητικές μετρούν από το τέλος, αλλά αποτυγχάνουν σε κενή λίστα. Συχνές αιτίες είναι λάθος όριο βρόχου, λανθασμένη υπόθεση για split() ή δείκτης που έμεινε μετά από διαγραφή.

Αυτοτελές εκτελέσιμο παράδειγμα

Αποθήκευσε το παράδειγμα ως 009_IndexError.py και εκτέλεσε python3 009_IndexError.py. Ο έλεγχος καλύπτει τη λανθασμένη είσοδο και τη διορθωμένη περίπτωση.

def first_and_last(values):
    if not values:
        return None
    return values[0], values[-1]
assert first_and_last([]) is None
assert first_and_last([8]) == (8, 8)
assert first_and_last([8, 9]) == (8, 9)
try:
    [][0]
except IndexError:
    pass
else:
    raise AssertionError("empty list indexed")

Διαγνωστική διαδικασία και ασφαλής διόρθωση

Έλεγξε len(sequence) και τον δείκτη στο σημείο αποτυχίας. Ακολούθησε ποιος δημιούργησε ή μείωσε τη λίστα. Προτίμησε for value in values αν δεν χρειάζεσαι θέσεις και enumerate(values) αν χρειάζεσαι. Πιάσε IndexError μόνο αν η απουσία στοιχείου είναι αναμενόμενη περίπτωση.

Πρακτικό εργαστήριο / έλεγχος ορίων

Γράψε nth(values, index) με τεκμηριωμένη υποστήριξη αρνητικών δεικτών. Αποφάσισε αν εκτός ορίων επιστρέφει None ή κάνει raise· δοκίμασε κενή λίστα, ένα στοιχείο, len(values) και -len(values)-1.

Ασφαλής πρόσβαση σε θέση χωρίς σύγχυση με None

Η επιστροφή None για ανύπαρκτο στοιχείο είναι αμφίσημη όταν η λίστα μπορεί να περιέχει πραγματικό None. Χρησιμοποίησε ξεχωριστό αντικείμενο-δείκτη που δίνει ο καλών και όρισε ρητά αν επιτρέπονται αρνητικοί δείκτες. Απέρριψε τις Boolean τιμές: στην Python το True λειτουργεί και ως ακέραιος 1.

def nth_or(values, index, default):
    if type(index) is not int:
        raise TypeError('index must be int, not bool')
    if -len(values) <= index < len(values):
        return values[index]
    return default

missing = object()
assert nth_or([None, 'b'], 0, missing) is None
assert nth_or([None, 'b'], -1, missing) == 'b'
assert nth_or([], 0, missing) is missing
assert nth_or([3], -2, missing) is missing
try: nth_or([1], True, missing)
except TypeError: pass
else: raise AssertionError('bool index accepted')

Εντοπισμός του πραγματικού ορίου

Για μήκος n, ο μικρότερος έγκυρος αρνητικός δείκτης είναι -n· ο -n-1 αποτυγχάνει. Πριν αλλάξεις τον έλεγχο, βρες αν ένα φίλτρο αφαίρεσε στοιχεία, αν η split() επέστρεψε λιγότερα πεδία ή αν άλλαξε η συλλογή μετά τον υπολογισμό της θέσης. Ως τελική άσκηση εξήγησε τις πέντε δοκιμές και πρόσθεσε μία πλειάδα και έναν θετικό δείκτη εκτός ορίων.