post

Python ro:Biblioteca Python standard

Contents

Introducere

Biblioteca Python standard conţine un număr uriaş de module utile şi este parte a oricărei instalări standard Python. Este important să vă familiarizaţi cu biblioteca standard întrucât multe probleme pot fi rezolvate rapid dacă cunoaşteţi plaja de lucruri pe care aceste module le pot face.

Vom explora câteva module utilizate mai frecvent din această bibliotecă. Detaliile complete (în limba engleză) despre biblioteca Python standard pot fi găsite în capitolul ‘Library Reference’ din documentaţia care vine cu instalarea Python.

Să explorăm cateva module utile.

Notă
Dacă aceste subiecte vi se par prea avansate puteţi trece peste acest capitol. Totuşi, vă recomand călduros să reveniţi atunci când veţi fi mai familiarizaţi cu folosirea limbajului Python.

Modulul sys

Modulul sys conţine funcţionalitate specifică sistemului de operare. Am aflat deja că lista sys.argv conţine argumentele liniei de comandă.

Să zicem că vreţi să verificaţi versiunea comenzii Python utilizate, să zicem pentru a vă asigura că este cel puţin versiunea 3. Modulul sys dă o astfel de funcţionalitate.

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

Cum funcţionează:

Modulul sys are un tuplu version_info care da informaţia despre versiune. Primul element dă versiunea majoră. Noi o putem testa pentru a ne asigura că programul rulează sub versiunea minim 3.0:

#!/usr/bin/python
# Fişier: versioncheck.py
import sys, warnings
if sys.version_info[0] < 3:
    warnings.warn("E nevoie de Python 3.0 sau ulterior pentru a rula acest program",
        RuntimeWarning)
else:
    print('Continuăm normal')

Rezultat:

   $ python2.5 versioncheck.py
   versioncheck.py:6: RuntimeWarning: E nevoie de Python 3.0 sau ulterior pentru a rula acest program

   $ python3 versioncheck.py
   Continuăm normal

Cum funcţionează:

Folosim alt modul din biblioteca standard, numit warnings (rom. avertizări) folosit pentru a afişa utilizatorului avertismente pe ecran. Dacă versiunea Python nu este cel puţin 3, afişăm un avertisment corespunzător.

Modulul logging

Ce e de făcut dacă vreţi să stocaţi undeva mesaje importante sau de depanare, astfel încât să le verificaţi mai târziu ca să analizaţi mersul programului? Cum stocaţi undeva aceste mesaje? Acest obiectiv pate fi atins folosind modulul logging (rom. jurnalizare).

#!/usr/bin/python
# Fişier: 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')

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

logging.debug("Începutul programului")
logging.info("O prelucrare importantă")
logging.warning("Încheiere")

Rezultat:

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

Dacă verificăm conţinutul fişierului test.log, vom găsi cam aşa:

   2009-02-09 13:18:16,233: DEBUG: Începutul programului
   2009-02-09 13:18:16,233: INFO: O prelucrare importantă
   2009-02-09 13:18:16,233: WARNING: Încheiere

Cum funcţionează:

Folosim trei module din biblioteza standard – modulul os pentru interacţiunea cu sistemul de operare, modulul platform pentru informaţii despre platformă adică sistemul de operare şi modulul logging pentru a jurnaliza informaţii.

La început verificăm ce versiune de sistem de operare folosim prin analiza şirului întors de funcţia platform.platform() (pentru informaţii suplimentare a se vedea import platform; help(platform)). Dacă este Windows, determinăm drive-ul pe care se află directoarele utilizatorului, directorul în care se găsesc acestea şi numele fişierului în care vom stoca informaţia. Combinând aceste trei părţi putem stabili calea întreagă a fişierului. Pentru alte platforme ne trebuie doar directorul utilizatorului şi avem calea completă a fişierului.

Folosim funcţia os.path.join() pentru a reuni aceste trei părţi ale căii. Motivul pentru care folosim o funcţie specială în loc de simpla concatenare este garanţia că rezultatul va fi conform aşteptărilor sistemului de operare.

Configurăm modulul logging să scrie toate mesajele întrun format anume, în fişierul specificat.

În final, putem stoca mesaje pentru debugging, urmărire, avertizare sau chiar mesaje critice. Odată ce programul a fost lansat, putem vedea ce s-a întâmplat în program, chiar dacă nu a fost afişat nimic pe ecran utilizatorului care a lansat programul.

Modulele urllib şi json

Cât de distractiv ar fi dacă aţi putea scrie programe care să dea rezultatul unor căutări pe Internet? Ia să vedem.

Putem face asta folosind câteva module. Întâi modulul urllib pe care îl folosim ca să aducă o pagină de pe Internet. Vom folosi motorul de căutare Yahoo! pentru a obţine rezultatele căutării şi din fericire el ne va da rezultatele căutării în format JSON ceea ce e uşor de procesat pentru noi datorită modulului json din biblioteca standard.

TODO
Acest program nu funcţionează încă ceea ce pare a fi o eroare (engl. bug) în Python 3.0 beta 2.
#!/usr/bin/python
# Fişier: yahoo_search.py

import sys
if sys.version_info[0] != 3:
    sys.exit('Acest program necesită Python 3.0 sau ulterior')

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

# Vă puteţi lua APP ID la http://developer.yahoo.com/wsregapp/
YAHOO_APP_ID = 'jl22psvV34HELWhdfUJbfDQzlJ2B57KFS_qs4I8D0Wz5U5_yCI1Awv8.lBSfPhwr'
SEARCH_BASE = 'http://search.yahooapis.com/WebSearchService/V1/webSearch'

class YahooSearchError(Excepţie):
    pass

# Luat de la http://developer.yahoo.com/python/python-json.html
def search(interogare, rezultate=20, start=1, **kwargs):
    kwargs.update({
        'appid': YAHOO_APP_ID,
        'query': interogare,
        'results': rezultate,
        '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('Ce doriţi să căutaţi? ')
for result in search(query)['Rezultat']:
    print("{0}: {1}".format(result['Titlu'], result['Url']))

Rezultat:

TODO

Cum funcţionează:

Putem obţine rezultatul căutării de la un anumit website dând şirul după care căutăm, întrun anumit format. Trebuie să specificăm mai multe opţiuni pe care le combinăm folosind formatul cheie1=valoare1&cheie2=valoare2 care este procesat de funcţia urllib.parse.urlencode().

De exemplu, deschideţi acest link în browserul web (Internet Explorer sau similar) şi veţi vedea 20 de rezultate, începând cu primul, după cuvintele “byte of python”, şi cu rezultatul în format JSON.

Facem o conexiune la acest URL folosind funcţia urllib.request.urlopen() şi transmitem acea referinţă funcţiei json.load() care va citi conţinutul paginii şi va converti fiecare rezultat întrun obiect Python. Apoi ciclăm prin aceste obiecte şi le afişăm utilizatorului.

Seria Modulul săptămânii

Sunt multe de explorat în biblioteca standard cum ar fi depanarea, gestiunea opţiunilor liniei de comandă, expresiile regulare s.a.m.d.

Cea mai bună cale de a continua explorarea bibliotecii standard este citirea excelentei serii Modulul Python al săptămânii a lui Doug Hellmann.

Rezumat

Am explorat o parte din funcţionalitatea multor module din biblioteca Python standard. Este recomandat să parcurgeţi documentaţia bibliotecii Python standard pentru a vă face o idee asupra modulelor disponibile.

În continuare vom acoperi diverse aspecte care pot face Python mai complet.


Advertisements