Προγραμματισμός

4 ισχυρές δυνατότητες Python λείπει ακόμα

Η Python είναι μια ζωντανή γλώσσα - υπό συνεχή ανάπτυξη για να συμβαδίζει με την εποχή. Το Python Software Foundation δεν κάνει απλώς προσθήκες στην τυπική βιβλιοθήκη και στην εφαρμογή αναφοράς CPython, αλλά επίσης εισάγει νέες δυνατότητες και βελτιώσεις στην ίδια τη γλώσσα.

Για παράδειγμα, το Python 3.8 εισήγαγε μια νέα σύνταξη για in-line εργασίες (ο «χειριστής walrus») που καθιστά ορισμένες λειτουργίες πιο συνοπτικές. Μια άλλη πρόσφατα εγκεκριμένη βελτίωση σύνταξης, αντιστοίχιση προτύπων, θα διευκολύνει τη σύνταξη κώδικα που αξιολογεί για μία από τις πολλές πιθανές περιπτώσεις. Και τα δύο αυτά χαρακτηριστικά εμπνεύστηκαν από την παρουσία και τη χρησιμότητά τους σε άλλες γλώσσες.

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

Αληθινές σταθερές

Η Python δεν έχει την έννοια της σταθερής αξίας. Σήμερα, οι σταθερές στην Python είναι συνήθως θέμα συνήθειας. Χρήση ενός ονόματος που υπάρχει σε όλα τα καπάκια και την περίπτωση φιδιών - π.χ. DO_NOT_RESTART - είναι μια υπόδειξη ότι η μεταβλητή προορίζεται να είναι σταθερή. Ομοίως, τοπληκτρολόγηση. Τελικό ο τύπος σχολιασμού παρέχει μια υπόδειξη στους χειριστές ότι ένα αντικείμενο δεν πρέπει να τροποποιηθεί, αλλά δεν το επιβάλλει κατά το χρόνο εκτέλεσης.

Γιατί; Επειδή η μεταβλητότητα είναι βαθιά ριζωμένη στις συμπεριφορές του Python. Όταν εκχωρείτε μια τιμή σε μια μεταβλητή - π.χ.x = 3 - δημιουργείτε ένα όνομα στον τοπικό χώρο ονομάτων,Χ, και δείχνοντάς το σε ένα αντικείμενο στο σύστημα που έχει την ακέραια τιμή3. Η Python υποθέτει πάντοτε ότι τα ονόματα είναι μεταβλητά - ότι όποιος το όνομα θα μπορούσε να δείξει όποιος αντικείμενο. Αυτό σημαίνει ότι κάθε φορά που χρησιμοποιείται ένα όνομα, ο Python πηγαίνει στο πρόβλημα να αναζητήσει σε ποιο αντικείμενο δείχνει. Αυτός ο δυναμισμός είναι ένας από τους κύριους λόγους για τους οποίους η Python λειτουργεί πιο αργά από κάποιες άλλες γλώσσες. Ο δυναμισμός της Python προσφέρει μεγάλη ευελιξία και ευκολία, αλλά έρχεται με κόστος την απόδοση του χρόνου εκτέλεσης.

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

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

Εν ολίγοις, είναι πιθανό να δούμε πραγματικές σταθερές στο Python, αλλά θα ήταν μια σημαντική αλλαγή.

Αληθινή υπερφόρτωση και γενικά

Σε πολλές γλώσσες, πολλές εκδόσεις της ίδιας λειτουργίας μπορούν να γραφτούν για να λειτουργούν με διαφορετικά είδη εισόδου. Για παράδειγμα, αto_string () Η συνάρτηση θα μπορούσε να έχει διαφορετικές υλοποιήσεις για μετατροπή από ακέραιους, αριθμούς κινητής υποδιαστολής ή άλλα αντικείμενα - αλλά θα μοιράζονταν το ίδιο όνομα για λόγους ευκολίας. Η "υπερφόρτωση" ή "γενικά" διευκολύνει την εγγραφή ισχυρού λογισμικού, καθώς μπορείτε να γράψετε γενικές μεθόδους για κοινές διαδικασίες αντί να χρησιμοποιήσετε μια μέθοδο ειδικά για έναν συγκεκριμένο τύπο.

Η Python σάς επιτρέπει να χρησιμοποιείτε ένα όνομα συνάρτησης που κάνει τη δουλειά πολλών, αλλά όχι καθορίζοντας πολλές παρουσίες μιας συνάρτησης. Μπορείτε να ορίσετε ένα όνομα μόνο μία φορά σε ένα δεδομένο εύρος και να το συνδέσετε σε ένα μόνο αντικείμενο κάθε φορά, έτσι ώστε να μην μπορείτε να έχετε πολλές εκδόσεις μιας μεμονωμένης συνάρτησης με το ίδιο όνομα.

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

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

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

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

Βελτιστοποιήσεις αναδρομής ουράς

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

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

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

Πολυγραμμικά λάμδα

Ο Lambdas, ή ανώνυμες συναρτήσεις, το έκανε στο Python μόνο μετά από κάποια αντίσταση εκ μέρους του δημιουργού γλωσσών Guido van Rossum. Καθώς το Python lambdas υπάρχει τώρα, είναι πολύ περιορισμένα: Σας επιτρέπουν μόνο να χρησιμοποιήσετε μια μόνο έκφραση (ουσιαστικά, οτιδήποτε στα δεξιά ενός σημείου ίσου σε μια λειτουργία ανάθεσης) ως σώμα λειτουργίας. Εάν θέλετε ένα πλήρες σύνολο δηλώσεων, απλώς διαχωρίστε τις και κάντε μια πραγματική λειτουργία από αυτές.

Ο λόγος έρχεται στον σχεδιασμό της γλώσσας καθώς το βλέπει ο Van Rossum. Όπως έγραψε ο van Rossum το 2006, «το βρίσκωόποιος μη αποδεκτή λύση που ενσωματώνει ένα μπλοκ με εσοχή στο μέσο μιας έκφρασης. Δεδομένου ότι βρίσκω εναλλακτική σύνταξη για την ομαδοποίηση δηλώσεων (π.χ. αγκύλες ή λέξεις-κλειδιά έναρξης / λήξης) εξίσου απαράδεκτες, αυτό καθιστά σχεδόν ένα multiline lambda ένα άλυτο παζλ.

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

Πολύγραμμοι λάμδα πιθανώς δεν συμβαίνουν στην Πύθωνα

Διαβάστε περισσότερα για Python:

  • Python 3.9: Τι νέο υπάρχει και καλύτερο
  • Οι καλύτερες νέες δυνατότητες στο Python 3.8
  • Καλύτερη διαχείριση έργου Python με την Ποίηση
  • Virtualenv και venv: Εξηγήθηκαν εικονικά περιβάλλοντα Python
  • Το Python virtualenv και το venv κάνουν και δεν πρέπει
  • Η εξήγηση και οι υποεπεξεργασίες Python εξηγούνται
  • Πώς να χρησιμοποιήσετε το πρόγραμμα εντοπισμού σφαλμάτων Python
  • Πώς να χρησιμοποιήσετε το χρονοδιάγραμμα για τον προφίλ κώδικα Python
  • Πώς να χρησιμοποιήσετε το cProfile για να προβάλετε τον κώδικα Python
  • Ξεκινήστε με το async στο Python
  • Πώς να χρησιμοποιήσετε το asyncio στο Python
  • Πώς να μετατρέψετε το Python σε JavaScript (και να επιστρέψετε ξανά)
  • Python 2 EOL: Πώς να επιβιώσετε στο τέλος του Python 2
  • 12 Pythons για κάθε ανάγκη προγραμματισμού
  • 24 βιβλιοθήκες Python για κάθε προγραμματιστή Python
  • 7 γλυκά IDE Python που ίσως έχετε χάσει
  • 3 μεγάλες αδυναμίες της Python - και οι λύσεις τους
  • Συγκρίθηκαν 13 πλαίσια Ιστού Python
  • 4 Πλαίσια δοκιμής Python για τη συντριβή των σφαλμάτων σας
  • 6 υπέροχες νέες δυνατότητες Python που δεν θέλετε να χάσετε
  • 5 Διανομές Python για την εξάσκηση της μηχανικής μάθησης
  • 8 υπέροχες βιβλιοθήκες Python για επεξεργασία φυσικής γλώσσας
  • 6 βιβλιοθήκες Python για παράλληλη επεξεργασία
  • Τι είναι το PyPy; Γρηγορότερη Python χωρίς πόνο
  • Τι είναι το Cython; Python με ταχύτητα C