post

Python el:Πρότυπη βιβλιοθήκη

Contents

Εισαγωγή

Η πρότυπη βιβλιοθήκη της Python περιέχει έναν τεράστιο αριθμό χρήσιμων αρθρωμάτων –~~~~Insert non-formatted text here–~~~~–~~~~–~~~~–~~~~
—-

—-

—-

—-
[[[http://www.example.com link title]]]και είναι μέρος κάθε πρότυπης εγκατάστασης Python. Είναι σημαντικό να εξοικειωθείτε με την πρότυπη βιβλιοθήκη, επειδή πολλά προβλήματα μπορούν να λυθούν γρήγορα εάν είστε εξοικειωμένοι με το εύρος των πραγμάτων που μπορούν να κάνουν οι βιβλιοθήκες.

Θα εξερευνήσουμε μερικά από τα πιο συνηθισμένα αρθρώματα σε αυτή τη βιβλιοθήκη. Μπορείτε να βρείτε ολοκληρωμένες λεπτομέρειες για όλα τα αρθρώματα της πρότυπης βιβλιοθήκης, στο ‘Library Reference’ section της τεκμηρίωσης που συνοδεύει κάθε εγκατάσταση της Python.

Aς εξερευνήσουμε μερικά χρήσιμα αρθρώματα.

Σημείωση
Εάν βρείτε τα θέματα σε αυτό το κεφάλαιο πολύ προχωρημένα (advanced) μπορείτε να παραλείψετε αυτό το κεφάλαιο. Πάντως, εγώ σας συνιστώ να επιστρέψετε σε αυτό το κεφάλαιο, όταν νιώθετε πιο άνετα προγραμματίζοντας με Python.

Το άρθρωμα sys

Το άρθρωμα sys περιέχει λειτουργικότητα ειδικά για το σύστημα. Έχουμε ήδη δει ότι η λίστα sys.argv περιέχει τα ορίσματα της γραμμής εντολών.

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

>>> import sys
>>> sys.version_info
(3, 0, 0, 'beta', 2)
>>> sys.version_info[0] >= 3
True

Πώς δουλεύει:

Tο άρθρωμα sys έχει την πλειάδα version_info που μας δίνει την πληροφορία για την έκδοση. Η πρώτη καταχώρηση είναι η κύρια έκδοση. Αυτό μπορούμε να το ελέγξουμε, για παράδειγμα, για να επιβεβαιώσουμε ότι το πρόγραμμα τρέχει μόνο υπό την Python 3.0:

#!/usr/bin/python
# Filename: versioncheck.py
import sys, warnings
if sys.version_info[0] < 3:
    warnings.warn("Need Python 3.0 for this program to run",
        RuntimeWarning)
else:
    print('Proceed as normal')

Έξοδος:

   $ python2.5 versioncheck.py
   versioncheck.py:6: RuntimeWarning: Need Python 3.0 for this program to run
     RuntimeWarning)

   $ python3 versioncheck.py
   Proceed as normal

Πώς δουλεύει:

Χρησιμοποιούμε ένα άλλο άρθρωμα από την πρότυπη βιβλιοθήκη που ονομάζεται warnings, που χρησιμοποιείται για να εμφανίσει προειδοποιήσεις στον τελικό χρήστη. Εάν το νούμερο της έκδοσης Python δεν είναι τουλάχιστον 3, εμφανίζουμε την αντίστοιχη προειδοποίηση.

Το άρθρωμα logging

Tι θα κάνατε εάν θέλατε να αποθηκεύονται κάπου μερικά μηνύματα εκσφαλμάτωσης ή άλλα σημαντικά μηνύματα, έτσι ώστε να μπορείτε να ελέγξετε εάν το πρόγραμμά σας έχει τρέξει όπως θα περιμένατε; Πώς “αποθηκεύετε κάπου” αυτά τα μηνύματα; Αυτό μπορεί να επιτευχθεί χρησιμοποιώντας το άρθρωμα logging:

#!/usr/bin/python
# Filename: use_logging.py
import os, platform, logging

if platform.platform().startswith('Windows'):
    logging_file = os.path.join(os.getenv('HOMEDRIVE'), os.getenv('HOMEPATH'), 'test.log')
else:
    logging_file = os.path.join(os.getenv('HOME'), 'test.log')

print("Logging to", logging_file)

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s:%(levelname)s:%(message)s',
    filename = logging_file,
    filemode = 'w',
)

logging.debug("Start of the program")
logging.info("Doing something")
logging.warning("Dying now")

Έξοδος:

   $python use_logging.py
   Logging to C:Usersswarooptest.log

Αν ελέγξουμε τα περιεχόμενα του αρχείου test.log, θα μοιάζουν με τα εξής:

   2008-09-03 13:18:16,233: DEBUG: Start of the program
   2008-09-03 13:18:16,233: INFO: Doing something
   2008-09-03 13:18:16,233: WARNING: Dying now

Πώς δουλεύει:

Χρησιμοποιούμε τρία αρθρώματα από την πρότυπη βιβλιοθήκη – το άρθρωμα os για αλληλεπίδραση με το λειτουργικό σύστημα, το άρθρωμα platform για πληροφορίες σχετικά με την πλατφόρμα, δηλαδή το λειτουργικό σύστημα, και το άρθρωμα logging για τις καταγραφές (log).

Αρχικά, ελέγχουμε ποιο λειτουργικό σύστημα χρησιμοποιούμε, ελέγχοντας τη συμβολοσειρά που επιστρέφεται από την platform.platform() (για περισσότερες πληροφορίες, δείτε την import platform; help(platform)). Εάν είναι Windows εμφανίζουμε τον home drive, το φάκελο home και το όνομα του αρχείου (filename) όπου θέλουμε να αποθηκεύσουμε τις πληροφορίες. Τοποθετώντας αυτά τα τρία μέρη μαζί, παίρνουμε την ολοκληρωμένη θέση του αρχείου. Για άλλες πλατφόρμες, απαιτείται να ξέρουμε μόνο το φάκελο home του χρήστη και παίρνουμε την πλήρη θέση του αρχείου.

Χρησιμοποιούμε τη συνάρτηση os.path.join() για να τοποθετήσουμε αυτά τα τρία μέρη της θέσης του αρχείου μαζί. Ο λόγος για τον οποίο χρησιμοποιούμε μια ειδική συνάρτηση, αντί να προσθέσουμε απλά τις συμβολοσειρές μαζί, είναι διότι αυτή η συνάρτηση θα επιβεβαιώσει ότι η πλήρης θέση ταιριάζει με το μορφότυπο (format) που αναμένεται από το λειτουργικό σύστημα.

Ρυθμίζουμε το άρθρωμα logging για να γράψουμε όλα τα μηνύματα σε ένα ιδιαίτερο μορφότυπο στο αρχείο που έχουμε καθορίσει.

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

Τα αρθρώματα urllib και json

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

Αυτό μπορεί να επιτευχθεί χρησιμοποιώντας μερικά αρθρώματα. Αρχικά είναι το άρθρωμα urllib, το οποίο μπορούμε να χρησιμοποιήσουμε για να “πιάσουμε” οποιαδήποτε ιστοσελίδα από το διαδίκτυο. Θα χρησιμοποιήσουμε το Yahοo! Search για να πάρουμε τα αποτελέσματα της αναζήτησης και ευτυχώς μπορεί να μας δώσει τα αποτελέσματα σε ένα μορφότυπο που ονομάζεται JSON, ο οποίος είναι εύκολος για εμάς να αναλύσουμε, επειδή υπάρχει το ενσωματωμένο άρθρωμα json στην πρότυπη βιβλιοθήκη.

TODO
Αυτό το πρόγραμμα δεν δουλεύει ακόμα και φαίνεται ότι είναι σφάλμα (bug) στην Python 3.0 beta 2.
#!/usr/bin/python
# Filename: yahoo_search.py

import sys
if sys.version_info[0] != 3:
    sys.exit('This program needs Python 3.0')

import json
import urllib, urllib.parse, urllib.request, urllib.response

# Get your own APP ID at http://developer.yahoo.com/wsregapp/
YAHOO_APP_ID = 'jl22psvV34HELWhdfUJbfDQzlJ2B57KFS_qs4I8D0Wz5U5_yCI1Awv8.lBSfPhwr'
SEARCH_BASE = 'http://search.yahooapis.com/WebSearchService/V1/webSearch'

class YahooSearchError(Exception):
    pass

# Taken from http://developer.yahoo.com/python/python-json.html
def search(query, results=20, start=1, **kwargs):
    kwargs.update({
        'appid': YAHOO_APP_ID,
        'query': query,
        'results': results,
        'start': start,
        'output': 'json'
    })
    url = SEARCH_BASE + '?' + urllib.parse.urlencode(kwargs)
    result = json.load(urllib.request.urlopen(url))
    if 'Error' in result:
        raise YahooSearchError(result['Error'])
    return result['ResultSet']

query = input('What do you want to search for? ')
for result in search(query)['Result']:
    print("{0}: {1}".format(result['Title'], result['Url']))

Έξοδος:

TODO

Πώς δουλεύει:

Μπορούμε να πάρουμε τα αποτελέσματα της αναζήτησης από ένα συγκεκριμένο δικτυακό τόπο, δίνοντας το κείμενο που ψάχνουμε σε ένα ιδιαίτερο μορφότυπο. Πρέπει να καθορίσουμε πολλές επιλογές, τις οποίες συνδυάζουμε χρησιμοποιώντας το μορφότυπο key1=value1&key2=value2, ο οποίος χειρίζεται από τη συνάρτηση urllib.parse.urlencode().

Έτσι για παράδειγμα, ανοίξτε αυτό το σύνδεσμο στο φυλλομετρητή σας και θα δείτε 20 αποτελέσματα, αρχίζοντας από το πρώτο αποτέλεσμα, για τις λέξεις “byte of python”, και ζητάμε την έξοδο στο μορφότυπο JSON.

Kάνουμε μια σύνδεση σε αυτή τη διεύθυνση (URL) χρησιμοποιώντας τη συνάρτηση urllib.request.urlopen() και περνούμε αυτό το αρχείο να το χειριστεί η json.load(), η οποία θα διαβάσει το περιεχόμενο και ταυτόχρονα θα το μετατρέψει σε αντικείμενο της Python. Τότε κάνουμε βρόχο μέσω αυτών των αποτελεσμάτων και το παρουσιάζουμε στον τελικό χρήστη.

Το άρθρωμα της εβδομάδας

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

Ο καλύτερος τρόπος για να εξερευνήσετε περισσότερο την πρότυπη βιβλιοθήκη είναι, διαβάζοντας την υπέροχη σειρά του Doug Hellmann’s, Python Module of the Week.

Σύνοψη

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

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


Πίσω στα περιεχόμενα