Αποτελεσματικός εντοπισμός σφαλμάτων με τη δήλωση Python Assert

Είσαι προγραμματιστής; Αν ναι, ο εντοπισμός σφαλμάτων είναι μια βασική δεξιότητα, ανεξάρτητα από τη γλώσσα στην οποία κωδικοποιείτε. Σε αυτό το άρθρο, θα μάθετε πώς να χρησιμοποιείτε τη δήλωση βεβαίωσης στην Python για αποτελεσματικό εντοπισμό σφαλμάτων.

Όταν εργάζεστε σε ένα έργο, θα ορίζετε πολλαπλές ενότητες. Αυτό περιλαμβάνει συναρτήσεις, ορισμούς κλάσεων και πολλά άλλα. Και πιθανότατα θα αντιμετωπίσετε σφάλματα ή απροσδόκητα αποτελέσματα λόγω ενός σφάλματος στην υλοποίηση. Οι δηλώσεις διεκδίκησης είναι χρήσιμες για τον εντοπισμό σφαλμάτων τέτοιου κώδικα.

Σε αυτό το σεμινάριο, θα μάθουμε τη σύνταξη για τη χρήση της δήλωσης βεβαίωσης ακολουθούμενη από παραδείγματα κώδικα για να τη δούμε σε δράση. Θα δούμε επίσης τι είναι τα σφάλματα διαβεβαίωσης και πώς μπορούμε να τα χρησιμοποιήσουμε για να διορθώσουμε τα σφάλματα στον κώδικα κατά την ανάπτυξη.

Ας ξεκινήσουμε!

Πώς να χρησιμοποιήσετε τη δήλωση Assert στην Python

Θα μάθουμε τη σύνταξη για να χρησιμοποιήσουμε τη δήλωση ισχυρισμού και, στη συνέχεια, θα προχωρήσουμε στην κωδικοποίηση ορισμένων παραδειγμάτων.

Σύνταξη της δήλωσης επιβεβαίωσης

Ας ξεκινήσουμε με τη σύνταξη για να χρησιμοποιήσουμε την εντολή assert στην Python:

assert expression, message

Εδώ,

  • έκφραση είναι οποιαδήποτε έγκυρη έκφραση Python προς αξιολόγηση. Αυτό μπορεί να είναι μια συνθήκη για την τιμή της μεταβλητής, την τιμή αλήθειας της μεταβλητής, την επιστρεφόμενη τιμή από μια συνάρτηση και άλλα.
  • Εφόσον η έκφραση αξιολογείται σε True, η δήλωση βεβαίωσης δεν εμφανίζει σφάλμα ούτε επιστρέφει τίποτα. Αυτό δείχνει ότι το πρόγραμμα λειτουργεί όπως αναμένεται.
  • Εάν η έκφραση δεν είναι πλέον True, δημιουργείται μια εξαίρεση AssertionError.
  • Το μήνυμα είναι μια προαιρετική συμβολοσειρά. Μπορείτε να καθορίσετε ένα μήνυμα που θα εμφανίζεται στο ίχνος πίσω κάθε φορά που δημιουργείται μια εξαίρεση AssertionError.

Στη συνέχεια, ας προχωρήσουμε στην κωδικοποίηση μερικών παραδειγμάτων όπου η δήλωση ισχυρισμού μπορεί να μας βοηθήσει να γράψουμε πιο καθαρό και χωρίς σφάλματα κώδικα.

  Εισαγωγή στα Νευρωνικά Δίκτυα [+ 5 Learning Resources]

Μπορείτε να βρείτε τα παραδείγματα κώδικα που χρησιμοποιούνται σε αυτό το σεμινάριο σε αυτήν την ουσία του GitHub.

Παραδείγματα δηλώσεων της Python

Εξετάστε το ακόλουθο παράδειγμα. Ας υποθέσουμε ότι έχετε μια μεταβλητή έκπτωσης στον κώδικά σας. Αλλά θα θέλατε η τιμή του να είναι πάντα μικρότερη ή ίση με τη max_discount.

Για να ελέγξετε ότι κατά λάθος δεν έχετε ορίσει τη μεταβλητή έκπτωσης σε μια τιμή, μπορείτε να προσθέσετε έναν ισχυρισμό. Η έκφραση προς αξιολόγηση είναι: discount <= max_discount.

>>> max_discount = 50
>>> discount = 20
>>> assert discount <= max_discount

Εδώ, η έκπτωση (20) είναι μικρότερη από τη max_discount (50). Άρα η δήλωση διεκδίκησης δεν εκπέμπει κανένα σφάλμα.

Η εξαίρεση AssertionError

Εάν η μεταβλητή discount οριστεί σε τιμή μεγαλύτερη από max_discount, δημιουργείται μια εξαίρεση AssertionError.

>>> discount = 75
>>> assert discount <= max_discount
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

Γνωρίζουμε ότι η εντολή assert μας επιτρέπει επίσης να καθορίσουμε μια προαιρετική συμβολοσειρά μηνύματος.

Ας χρησιμοποιήσουμε επίσης μια συμβολοσειρά μηνυμάτων που παρέχει πιο περιγραφικές διαγνωστικές πληροφορίες. Στη δήλωση assert, ας προσθέσουμε μια συμβολοσειρά f Python που περιέχει επίσης τις τιμές discount και max_discount.

>>> assert discount <= max_discount, f"discount should be at most {max_discount}; got discount = {discount}"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: discount should be at most 50; got discount = 75

Όπως φαίνεται στο παραπάνω κελί εξόδου, η εξαίρεση AssertionError περιλαμβάνει τώρα τις τιμές των μεταβλητών discount και max_discount.

Εντοπισμός σφαλμάτων και δοκιμή συναρτήσεων Python με το Assert

Κατά τον ορισμό συναρτήσεων, μερικές φορές ενδέχεται να εισάγετε κατά λάθος σφάλματα (λογικά σφάλματα) που θα εμποδίσουν τη λειτουργία σας να λειτουργεί όπως προβλέπεται.

Ας πάρουμε ένα παράδειγμα. Ας υποθέσουμε ότι υπάρχει ένα τεστ σε μια τάξη και δίνεται η ευκαιρία στους μαθητές να επιχειρήσουν μια μπόνους ερώτηση. Κάθε μαθητής που επιχειρήσει την ερώτηση μπόνους θα λάβει 10 επιπλέον βαθμούς στο τεστ. 😄

  8 εργαλεία για να συνδυάσετε εύκολα βίντεο στο iPhone

Εξετάστε την ακόλουθη συνάρτηση get_final_score:

  • Χρειάζεται μια τρέχουσα βαθμολογία, ένα σκορ και ένα Boolean bonus.
  • Εάν ένας μαθητής έχει απαντήσει στην ερώτηση μπόνους, το Boolean bonus είναι True και παίρνει 10 βαθμούς περισσότερους από την τρέχουσα βαθμολογία του.
  • Στη συνέχεια, η συνάρτηση επιστρέφει την τελική βαθμολογία.
def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

Ας κάνουμε μερικές κλήσεις στη λειτουργία. Βλέπουμε ότι για βαθμολογίες 34 και 40 με μπόνους ορισμένο σε Σωστό και Λάθος, οι τελικές βαθμολογίες είναι 44 και 40, αντίστοιχα.

print(get_final_score(34,True))
# 44
print(get_final_score(40,False))
# 40

Ωστόσο, οι μέγιστοι βαθμοί στο τεστ είναι, ας πούμε, 50. Έτσι, εάν ένας μαθητής βαθμολογηθεί με 49 και έχει επίσης απαντήσει στην ερώτηση μπόνους, η συνάρτηση get_final_score θα υπολογίσει ευχαρίστως την τελική βαθμολογία σε 59.

print(get_final_score(49,True))
# 59

Τεχνικά, είναι δυνατό. Ας υποθέσουμε όμως ότι ένας μαθητής δεν μπορεί να συγκεντρώσει περισσότερους από τους μέγιστους δυνατούς βαθμούς για το τεστ. 🙂

Ας αρχικοποιήσουμε λοιπόν μια μεταβλητή max_score. Και καταγράψτε την επιστρεφόμενη βαθμολογία από τη συνάρτηση στη μεταβλητή final_score.

Στη συνέχεια προσθέτουμε έναν ισχυρισμό που ελέγχει εάν το τελικό_score είναι μικρότερο από το max_score.

def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

final_score = get_final_score(47,True)
max_score = 50

assert final_score <= max_score

Τώρα λαμβάνουμε μια εξαίρεση AssertionError για την κλήση συνάρτησης get_final_score(47,True):

Traceback (most recent call last):
  File "main.py", line 17, in <module>
    assert final_score <= max_score
AssertionError

Τώρα προσθέτουμε ένα περιγραφικό f-string στη δήλωση της Python assert:

assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
Traceback (most recent call last):
  File "main.py", line 17, in <module>
    assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
AssertionError: final_score should be at most 50; got 57

Τροποποίηση της Λειτουργίας

Ας επιστρέψουμε και ας τροποποιήσουμε τον ορισμό της συνάρτησης get_final_score για να διορθώσουμε την απροσδόκητη συμπεριφορά:

  • Η συνάρτηση get_final_score λαμβάνει επίσης ως παράμετρο το max_score.
  • Ελέγχουμε αν το μπόνους είναι αληθές. Εάν είναι True, προσθέτουμε 10 βαθμούς στη μεταβλητή βαθμολογίας.
  • Στη συνέχεια, ελέγχουμε αν το σκορ είναι μεγαλύτερο από το max_score. Αν ναι, επιστρέφουμε max_score.
  • Διαφορετικά, επιστρέφουμε βαθμολογία.
  7 Κατασκευαστές Οργανωτικών Διαγραμμάτων για να Ορίσουν την Ιεραρχία της Ομάδας

Έχουμε πλέον εξασφαλίσει ότι το τελικό σκορ είναι πάντα μικρότερο ή ίσο με το max_score.

def get_final_score(score,bonus,max_score):
    if bonus:
        score += 10
    if score > max_score:
        return max_score
    return score

Ως γρήγορη άσκηση, γράψτε μερικούς ισχυρισμούς για να επιβεβαιώσετε ότι η συνάρτηση λειτουργεί πλέον όπως αναμένεται.

Σημείωση σχετικά με την εξαίρεση σφαλμάτων ισχυρισμού

Αν και εμφανίζεται μια εξαίρεση AssertionError όταν η έκφραση αξιολογείται σε False, θα πρέπει να θυμόμαστε ότι δεν πρέπει να χειριζόμαστε τέτοια σφάλματα ως εξαιρέσεις. Δηλαδή δεν πρέπει να κάνουμε κάτι σαν αυτό:

try:
    <doing this>
except AssertionError:
    <do this>

Στο προηγούμενο παράδειγμα στο get_final_score, χρησιμοποιήσαμε τον ισχυρισμό για να ελέγξουμε εάν το final_score είναι μικρότερο από το max_score. Στη συνέχεια τροποποιήσαμε τον ορισμό της συνάρτησης έτσι ώστε να μην υπάρχουν σφάλματα ισχυρισμών.

Γι’ αυτό είναι οι ισχυρισμοί. Είναι έλεγχοι λογικής για τον κώδικα και βοηθούν στη σύνταξη καθαρότερου κώδικα. Ο χειρισμός εξαίρεσης, από την άλλη πλευρά, είναι η πρόβλεψη και ο χειρισμός απροσδόκητων σφαλμάτων κατά το χρόνο εκτέλεσης. Αυτά συχνά περιλαμβάνουν μη έγκυρους τύπους και τιμές εισόδου.

Συνοψίζοντας, θα πρέπει να χρησιμοποιήσετε τη δήλωση διεκδίκησης Python για αποτελεσματικό εντοπισμό σφαλμάτων και να μην χειρίζεστε τα AssertionErrors ως εξαιρέσεις.

συμπέρασμα

Αυτό το σεμινάριο σάς βοήθησε να κατανοήσετε πώς να χρησιμοποιήσετε τη δήλωση διεκδίκησης στην Python. Ακολουθεί μια περίληψη των όσων μάθατε:

  • Οι δηλώσεις (βεβαιώσεις) της Python έχουν τη μορφή έκφρασης ισχυρισμού. Αυτό ελέγχει εάν η έκφραση είναι True. Εάν δεν αξιολογηθεί σε True, δημιουργείται μια εξαίρεση AssertionError.
  • Μπορείτε επίσης να χρησιμοποιήσετε τη διεκδίκηση με τη συντακτική έκφραση ισχυρισμού, μήνυμα. Αυτό θα εκτυπώσει τη συμβολοσειρά μηνύματος κάθε φορά που εμφανίζεται μια εξαίρεση AssertionError.
  • Θα πρέπει να θυμάστε να μην εφαρμόζετε τον χειρισμό εξαιρέσεων για τον χειρισμό σφαλμάτων ισχυρισμών. Και χρησιμοποιήστε τους ισχυρισμούς ως ένα χρήσιμο εργαλείο εντοπισμού σφαλμάτων για ελέγχους λογικής του κώδικά σας.

Ως προγραμματιστής, οι ισχυρισμοί σάς βοηθούν με τον εντοπισμό σφαλμάτων. Για να διασφαλίσετε ότι όλα τα μεμονωμένα στοιχεία (ενότητες) του έργου λειτουργούν όπως αναμένεται, μπορείτε να μάθετε πώς να γράφετε δοκιμές μονάδων στην Python.

Στη συνέχεια, ρίξτε μια ματιά σε αυτήν τη λίστα αρχαρίων έργων Python στα οποία μπορείτε να εργαστείτε.