Η διαδρομή για τον έλεγχο πληκτρολόγησης 4 εκατομμυρίων γραμμών κώδικα Python. Μέρος 3

Παρουσιάζουμε στην προσοχή σας το τρίτο μέρος της μετάφρασης του υλικού σχετικά με τη διαδρομή που πήρε το Dropbox κατά την εφαρμογή ενός συστήματος ελέγχου τύπου για κώδικα Python.

Η διαδρομή για τον έλεγχο πληκτρολόγησης 4 εκατομμυρίων γραμμών κώδικα Python. Μέρος 3

→ Προηγούμενα μέρη: πρώτα и δεύτερος

Φτάνοντας τις 4 εκατομμύρια γραμμές δακτυλογραφημένου κώδικα

Μια άλλη σημαντική πρόκληση (και η δεύτερη πιο κοινή ανησυχία μεταξύ των ερωτηθέντων εσωτερικά) ήταν η αύξηση του όγκου του κώδικα που καλύπτεται από τους ελέγχους τύπου στο Dropbox. Έχουμε δοκιμάσει διάφορες προσεγγίσεις για να λύσουμε αυτό το πρόβλημα, από τη φυσική αύξηση του μεγέθους της πληκτρολογημένης βάσης κωδικών έως την εστίαση των προσπαθειών της ομάδας mypy σε στατικά και δυναμικά αυτοματοποιημένα συμπεράσματα τύπων. Στο τέλος, φαινόταν ότι δεν υπήρχε απλή στρατηγική νίκης, αλλά καταφέραμε να επιτύχουμε ταχεία ανάπτυξη στον όγκο του σχολιασμένου κώδικα συνδυάζοντας πολλές προσεγγίσεις.

Ως αποτέλεσμα, το μεγαλύτερο αποθετήριο Python (με κώδικα υποστήριξης) έχει σχεδόν 4 εκατομμύρια γραμμές σχολιασμένου κώδικα. Οι εργασίες για την πληκτρολόγηση στατικού κώδικα ολοκληρώθηκαν σε περίπου τρία χρόνια. Το Mypy υποστηρίζει πλέον διάφορους τύπους αναφορών κάλυψης κώδικα που διευκολύνουν την παρακολούθηση της προόδου της πληκτρολόγησης. Συγκεκριμένα, μπορούμε να δημιουργήσουμε αναφορές για κώδικα με ασάφειες στους τύπους, όπως, για παράδειγμα, ρητή χρήση ενός τύπου Any σε σχολιασμούς που δεν μπορούν να επαληθευτούν ή με πράγματα όπως η εισαγωγή βιβλιοθηκών τρίτων που δεν διαθέτουν σχολιασμούς τύπων. Ως μέρος ενός έργου για τη βελτίωση της ακρίβειας του ελέγχου τύπων στο Dropbox, συμβάλαμε στη βελτίωση των ορισμών τύπων (τα λεγόμενα stub files) για ορισμένες δημοφιλείς βιβλιοθήκες ανοιχτού κώδικα σε ένα κεντρικό αποθετήριο Python δακτυλογραφημένος.

Εφαρμόσαμε (και τυποποιήσαμε σε επόμενα PEP) νέα χαρακτηριστικά του συστήματος τύπων που επιτρέπουν πιο ακριβείς τύπους για ορισμένα συγκεκριμένα μοτίβα Python. Ένα αξιοσημείωτο παράδειγμα αυτού είναι TypeDict, το οποίο παρέχει τύπους για λεξικά τύπου JSON που έχουν ένα σταθερό σύνολο πλήκτρων συμβολοσειράς, το καθένα με μια τιμή του δικού του τύπου. Θα συνεχίσουμε να επεκτείνουμε το σύστημα τύπων. Το επόμενο βήμα μας θα είναι πιθανότατα να βελτιώσουμε την υποστήριξη για τις αριθμητικές δυνατότητες της Python.

Η διαδρομή για τον έλεγχο πληκτρολόγησης 4 εκατομμυρίων γραμμών κώδικα Python. Μέρος 3
Αριθμός γραμμών σχολιασμένου κώδικα: διακομιστής

Η διαδρομή για τον έλεγχο πληκτρολόγησης 4 εκατομμυρίων γραμμών κώδικα Python. Μέρος 3
Αριθμός γραμμών σχολιασμένου κώδικα: πελάτης

Η διαδρομή για τον έλεγχο πληκτρολόγησης 4 εκατομμυρίων γραμμών κώδικα Python. Μέρος 3
Συνολικός αριθμός γραμμών σχολιασμένου κώδικα

Ακολουθεί μια επισκόπηση των κύριων χαρακτηριστικών των πραγμάτων που κάναμε για να αυξήσουμε την ποσότητα του σχολιασμένου κώδικα στο Dropbox:

Αυστηρότητα σχολιασμού. Σταδιακά αυξήσαμε τις απαιτήσεις για την αυστηρότητα του σχολιασμού του νέου κώδικα. Ξεκινήσαμε με συμβουλές για το linter που πρότειναν την προσθήκη σχολιασμών σε αρχεία που είχαν ήδη κάποιους σχολιασμούς. Τώρα απαιτούμε σχολιασμούς τύπων στα νέα αρχεία Python και στα περισσότερα υπάρχοντα αρχεία.

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

Εκλαΐκευση του mypy. Μιλάμε για το mypy σε εκδηλώσεις και μιλάμε με ομάδες για να τις βοηθήσουμε να ξεκινήσουν με τους σχολιασμούς τύπων.

Δημοσκοπήσεις. Διεξάγουμε περιοδικές έρευνες χρηστών για τον εντοπισμό σημαντικών προβλημάτων. Είμαστε έτοιμοι να πάμε αρκετά μακριά στην επίλυση αυτών των προβλημάτων (ακόμα και να δημιουργήσουμε μια νέα γλώσσα για να επιταχύνουμε το mypy!).

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

Ενσωμάτωση με συντάκτες. Έχουμε δημιουργήσει εργαλεία για την υποστήριξη της εκτέλεσης του mypy σε προγράμματα επεξεργασίας που είναι δημοφιλή στο Dropbox. Αυτό περιλαμβάνει PyCharm, Vim και VS Code. Αυτό απλοποίησε σημαντικά τη διαδικασία σχολιασμού του κώδικα και ελέγχου της λειτουργικότητάς του. Αυτοί οι τύποι ενεργειών είναι συνηθισμένοι κατά τον σχολιασμό υπάρχοντος κώδικα.

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

Υποστήριξη για βιβλιοθήκες τρίτων. Πολλά από τα έργα μας χρησιμοποιούν την εργαλειοθήκη SQLAlchemy. Εκμεταλλεύεται τις δυναμικές δυνατότητες της Python που οι τύποι PEP 484 δεν μπορούν να μοντελοποιήσουν απευθείας. Εμείς, σύμφωνα με το PEP 561, δημιουργήσαμε το αντίστοιχο αρχείο stub και γράψαμε ένα πρόσθετο για το mypy (ανοιχτή πηγή), το οποίο βελτιώνει την υποστήριξη SQLAlchemy.

Δυσκολίες που συναντήσαμε

Η διαδρομή προς 4 εκατομμύρια γραμμές πληκτρολογημένου κώδικα δεν ήταν πάντα εύκολη για εμάς. Σε αυτό το μονοπάτι συναντήσαμε πολλές λακκούβες και κάναμε αρκετά λάθη. Αυτά είναι μερικά από τα προβλήματα που αντιμετωπίσαμε. Ελπίζουμε ότι μιλώντας για αυτούς θα βοηθήσει άλλους να αποφύγουν παρόμοια προβλήματα.

Λείπουν αρχεία. Ξεκινήσαμε τη δουλειά μας ελέγχοντας μόνο ένα μικρό αριθμό αρχείων. Οτιδήποτε δεν περιλαμβάνεται σε αυτά τα αρχεία δεν ελέγχθηκε. Τα αρχεία προστέθηκαν στη λίστα σάρωσης όταν εμφανίστηκαν οι πρώτοι σχολιασμοί σε αυτά. Εάν κάτι εισήχθη από μια ενότητα που βρίσκεται εκτός του πεδίου επαλήθευσης, τότε μιλούσαμε για εργασία με τιμές όπως Any, τα οποία δεν δοκιμάστηκαν καθόλου. Αυτό οδήγησε σε σημαντική απώλεια της ακρίβειας πληκτρολόγησης, ειδικά στα πρώτα στάδια της μετανάστευσης. Αυτή η προσέγγιση έχει λειτουργήσει εκπληκτικά καλά μέχρι στιγμής, αν και μια τυπική κατάσταση είναι ότι η προσθήκη αρχείων στο εύρος της αναθεώρησης αποκαλύπτει προβλήματα σε άλλα μέρη της βάσης κώδικα. Στη χειρότερη περίπτωση, όταν συγχωνεύτηκαν δύο μεμονωμένες περιοχές κώδικα, στις οποίες, ανεξάρτητα η μία από την άλλη, είχαν ήδη ελεγχθεί οι τύποι, αποδείχθηκε ότι οι τύποι αυτών των περιοχών ήταν ασυμβίβαστοι μεταξύ τους. Αυτό οδήγησε στην ανάγκη να γίνουν πολλές αλλαγές στους σχολιασμούς. Κοιτάζοντας πίσω τώρα, συνειδητοποιούμε ότι θα έπρεπε να είχαμε προσθέσει βασικές μονάδες βιβλιοθήκης στην περιοχή ελέγχου τύπου του mypy νωρίτερα. Αυτό θα έκανε τη δουλειά μας πολύ πιο προβλέψιμη.

Σχολιασμός παλιού κώδικα. Όταν ξεκινήσαμε, είχαμε περίπου 4 εκατομμύρια γραμμές υπάρχοντος κώδικα Python. Ήταν σαφές ότι ο σχολιασμός όλου αυτού του κώδικα δεν ήταν εύκολη δουλειά. Δημιουργήσαμε ένα εργαλείο που ονομάζεται PyAnnotate που μπορεί να συλλέγει πληροφορίες τύπου καθώς εκτελούνται οι δοκιμές και μπορεί να προσθέσει σχολιασμούς τύπου στον κώδικά σας με βάση τις πληροφορίες που συλλέγονται. Ωστόσο, δεν έχουμε παρατηρήσει μια ιδιαίτερα διαδεδομένη υιοθέτηση αυτού του εργαλείου. Η συλλογή πληροφοριών τύπου ήταν αργή και οι σχολιασμοί που δημιουργούνταν αυτόματα απαιτούσαν συχνά πολλές μη αυτόματες επεξεργασίες. Σκεφτήκαμε να εκτελούμε αυτό το εργαλείο αυτόματα κάθε φορά που εξετάζουμε τον κώδικα ή συλλέγουμε πληροφορίες τύπου με βάση την ανάλυση κάποιου μικρού όγκου πραγματικών αιτημάτων δικτύου, αλλά αποφασίσαμε να μην το κάνουμε επειδή κάθε προσέγγιση ήταν πολύ επικίνδυνη.

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

Κυκλικές εισαγωγές. Παραπάνω, μίλησα για κυκλικές εισαγωγές (τα «κουβάρια εξάρτησης»), η ύπαρξη των οποίων δυσκόλευε την επιτάχυνση του mypy. Χρειάστηκε επίσης να δουλέψουμε σκληρά για να κάνουμε το mypy να υποστηρίζει όλα τα είδη ιδιωμάτων που προκαλούνται από αυτές τις κυκλικές εισαγωγές. Πρόσφατα ολοκληρώσαμε ένα σημαντικό έργο επανασχεδιασμού συστήματος που διόρθωσε τα περισσότερα από τα προβλήματα του mypy σχετικά με τις κυκλικές εισαγωγές. Αυτά τα προβλήματα στην πραγματικότητα προήλθαν από τις πολύ πρώτες μέρες του έργου, πίσω από την Alore, την εκπαιδευτική γλώσσα στην οποία επικεντρώθηκε αρχικά το έργο mypy. Η σύνταξη Alore διευκολύνει την επίλυση προβλημάτων με κυκλικές εντολές εισαγωγής. Το σύγχρονο mypy έχει κληρονομήσει ορισμένους περιορισμούς από την παλαιότερη, απλή υλοποίησή του (που ταίριαζε πολύ στο Alore). Η Python δυσκολεύει την εργασία με κυκλικές εισαγωγές, κυρίως επειδή οι εκφράσεις είναι διφορούμενες. Για παράδειγμα, μια λειτουργία ανάθεσης μπορεί στην πραγματικότητα να ορίσει ένα ψευδώνυμο τύπου. Το Mypy δεν είναι πάντα σε θέση να ανιχνεύσει πράγματα όπως αυτό έως ότου υποβληθεί σε επεξεργασία το μεγαλύτερο μέρος του βρόχου εισαγωγής. Δεν υπήρχαν τέτοιες ασάφειες στο Alore. Οι κακές αποφάσεις που λαμβάνονται στα αρχικά στάδια της ανάπτυξης του συστήματος μπορεί να παρουσιάσουν μια δυσάρεστη έκπληξη στον προγραμματιστή πολλά χρόνια αργότερα.

Αποτελέσματα: η διαδρομή προς 5 εκατομμύρια γραμμές κώδικα και νέους ορίζοντες

Το έργο mypy έχει προχωρήσει πολύ - από τα πρώιμα πρωτότυπα σε ένα σύστημα που ελέγχει 4 εκατομμύρια σειρές τύπων κωδικών παραγωγής. Καθώς το mypy εξελίχθηκε, οι υποδείξεις τύπου Python τυποποιήθηκαν. Αυτές τις μέρες, ένα ισχυρό οικοσύστημα έχει αναπτυχθεί γύρω από την πληκτρολόγηση κώδικα Python. Έχει μια θέση για υποστήριξη βιβλιοθήκης, περιέχει βοηθητικά εργαλεία για IDE και συντάκτες, έχει πολλά συστήματα ελέγχου τύπων, καθένα από τα οποία έχει τα δικά του πλεονεκτήματα και μειονεκτήματα.

Παρόλο που ο έλεγχος τύπου είναι ήδη δεδομένος στο Dropbox, πιστεύω ότι βρισκόμαστε ακόμα στις πρώτες μέρες της πληκτρολόγησης κώδικα Python. Νομίζω ότι οι τεχνολογίες ελέγχου τύπου θα συνεχίσουν να εξελίσσονται και να βελτιώνονται.

Εάν δεν έχετε ήδη χρησιμοποιήσει τον έλεγχο τύπου στο έργο μεγάλης κλίμακας Python, τότε να ξέρετε ότι τώρα είναι μια πολύ καλή στιγμή για να ξεκινήσετε τη στατική πληκτρολόγηση. Έχω μιλήσει με όσους έχουν κάνει παρόμοια μετάβαση. Κανείς τους δεν το μετάνιωσε. Ο έλεγχος τύπου καθιστά την Python μια γλώσσα που είναι πολύ πιο κατάλληλη για την ανάπτυξη μεγάλων έργων από την "κανονική Python".

Αγαπητοί αναγνώστες! Χρησιμοποιείτε έλεγχο τύπου στα έργα Python σας;

Η διαδρομή για τον έλεγχο πληκτρολόγησης 4 εκατομμυρίων γραμμών κώδικα Python. Μέρος 3
Η διαδρομή για τον έλεγχο πληκτρολόγησης 4 εκατομμυρίων γραμμών κώδικα Python. Μέρος 3

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο