Subsections


10. Una breve escursione nella libreria standard


10.1 Interfaccia con il Sistema Operativo

Il modulo os fornisce dozzine di funzioni per interagire con il Sistema Operativo:

>>> import os
>>> os.system('time 0:02')
0
>>> os.getcwd()      # Restituisce la directory di lavoro corrente
'C:\\Python24'
>>> os.chdir('/server/accesslogs')

Ci si assicuri di usare, per l'importazione, lo stile "import os"invece di "from os import *". Questo permetterà di distinguere os.open() dalla funzione open() che opera in modo del tutto differente.

Le funzioni built-in dir() ed help() sono utili come aiuto interattivo quando si lavora con moduli di grosse dimensioni come os:

>>> import os
>>> dir(os)
<restituisce una lista di tutti i moduli delle funzioni>
>>> help(os)
<restituisce una estesa pagina di manuale creata dalle docstring dei moduli>

Per sessioni amministrative giornaliere su file e directory, il modulo shutil fornisce un'interfaccia di alto livello semplice da usare:

>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
>>> shutil.move('/build/executables', 'installdir')


10.2 File wildcard

Il modulo glob fornisce funzioni per creare liste di file che provengono da directory sulle quali è stata effettuata una ricerca con caratteri wildcard (NdT: i caratteri jolly di espansione):

>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']


10.3 Argomenti da riga di comando

Molti script spesso invocano argomenti da riga di comando richiedendo che siano processati. Questi argomenti vengono memorizzati nel modulo sys ed argv è un attributo, come fosse una lista. Per istanza il seguente output fornisce il risultato dall'esecuzione di "python demo.py one two three"da riga di comando:

>>> import sys
>>> print sys.argv
['demo.py', 'one', 'two', 'three']

Il modulo getopt processa sys.argv usando le convenzioni della funzione getopt() di Unix. Viene fornita una più potente e flessibile riga di comando dal modulo optparse.


10.4 Redirigere gli errori in output e terminare il programma

Il modulo sys ha anche attributi per stdin, stdout e stderr. L'ultimo attributo è utile per mostrare messaggi di avvertimento ed errori e renderli visibili perfino quando stdout viene rediretto:

>>> sys.stderr.write('Attenzione, il file di log non c'è, ne viene\
...  creato uno nuovo')
Attenzione, il file di log non c'è, ne viene creato uno nuovo

Il modo più diretto per terminare l'esecuzione dello script è usare "sys.exit()".


10.5 Modello di corrispondenza per le stringhe

Il modulo re fornisce gli strumenti per processare le stringhe con le espressioni regolari. Per lavorare su complesse corrispondenze e manipolazioni, le espressioni regolari offrono una succinta, ottimizzata soluzione:

>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'

Quando vengono richieste solamente semplici funzionalità, è preferibile usare i metodi delle stringhe perché sono più semplici da leggere e da correggere se dovessero contenere degli errori:

>>> 'the per doo'.replace('doo', 'due')
'the per due'


10.6 Matematica

Il modulo math fornisce l'accesso alle funzioni della sottostante libreria C per i numeri matematici in virgola mobile:

>>> import math
>>> math.cos(math.pi / 4.0)
0.70710678118654757
>>> math.log(1024, 2)
10.0

il modulo random fornisce gli strumenti per creare selezioni di numeri casuali:

>>> import random
>>> random.choice(['mela', 'pera', 'banana'])
'mela'
>>> random.sample(xrange(100), 10)   # campione senza rimpiazzamento
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()    # numero in virgola mobile casuale
0.17970987693706186
>>> random.randrange(6)    # intero casuale scelto da range(6)
4


10.7 Accesso ad internet

Vi sono numerosi moduli per accedere ad internet e processarne i protocolli. Due moduli semplici sono urllib2 per recuperare dati da url e smtplib per spedire mail:

>>> import urllib2
>>> for line in urllib2.urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
... if 'EST' in line:      # vedete Eastern Standard Time
...     print line
    
<BR>Nov. 25, 09:43:32 PM EST

>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@tmp.org', 'jceasar@tmp.org',
"""To: jceasar@tmp.org
From: soothsayer@tmp.org

Beware the Ides of March.
""")
>>> server.quit()


10.8 Data e tempo

Il modulo datetime fornisce classi per manipolare data e tempo in modo semplice ma contemporaneamente complesso. Sebbene la data ed il tempo aritmetico siano supportati, il nucleo dell'implementazione è basato sull'efficienza di estrapolazione dei membri per la formattazione e manipolazione dell'output. Il modulo supporta anche oggetti che abbiano consapevolezza della propria time zone.

# le date vengono facilmente costruite e formattate
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y or %d%b %Y is a %A on the %d day of %B")
'12-02-03 or 02Dec 2003 is a Tuesday on the 02 day of December'

# le date supportano i calendari aritmetici
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368


10.9 Compressione dei dati

I comuni sistemi di archiviazione di dati ed i relativi formati di compressione vengono supportati direttamente dai moduli ed includono: zlib, gzip, bz2, zipfile e tarfile.

>>> import zlib
>>> s = 'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
'witch which has which witches wrist watch'
>>> zlib.crc32(t)
-1438085031


10.10 Misura delle prestazioni

Alcuni sviluppatori ed utenti di Python hanno il profondo interesse di conoscere le relative differenze di prestazioni tra due approcci di un identico problema. Python fornisce strumenti di misurazione che rispondono immediatamente a queste richieste.

Per esempio, potreste essere tentati di usare la funzionalità di impacchettamento e spacchettamento delle tuple invece del tradizionale approccio consistente nello scambiare gli argomenti. Il modulo timeit dimostra velocemente il modesto incremento di prestazioni:

>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791

In contrasto al sottile livello di granularità di timeit, i moduli profile e pstats forniscono strumenti per identificare sezioni critiche per la tempistica in grossi blocchi di codice.


10.11 Controllo di qualità

Un approccio per sviluppare un programma di alta qualità è scrivere dei test per ogni funzione mentre viene sviluppata ed eseguire quindi i suddetti test frequentemente durante il processo di sviluppo.

Il modulo doctest fornisce uno strumento per analizzare e validare test inseriti nelle docstring del programma. La costruzione dei test è semplice come il copia-ed-incolla di una tipica chiamata, compresi i risultati, inserita all'interno della docstring. Questo migliora la documentazione fornita all'utente con un esempio e permetterà al modulo doctest di occuparsi di mantenere la documentazione aggiornata con il codice:

def media(valori):
    """Computa la media aritmetica di una lista di numeri.

    >>> print media([20, 30, 70])
    40.0
    """
    return sum(valori, 0.0) / len(valori)

import doctest
doctest.testmod()   # automaticamente valida i test nella docstring

Il modulo unittest richiede uno sforzo maggiore di comprensione rispetto al modulo doctest, ma mette a disposizione un più nutrito insieme di test che potranno essere mantenuti in un file separato.

import unittest

class TestStatisticalFunctions(unittest.TestCase):

    def test_media(self):
        self.assertEqual(media([20, 30, 70]), 40.0)
        self.assertEqual(round(media([1, 5, 7]), 1), 4.3)
        self.assertRaises(ZeroDivisionError, media, [])
        self.assertRaises(TypeError, media, 20, 30, 70)

unittest.main() # La chiamata da riga di comando invoca tutti i test


10.12 Le batterie sono incluse

Python adotta la filosofia ``le batterie sono incluse''. Questo è il miglior modo di rappresentare le sofisticate e robuste capacità dei suoi generosi package. Per esempio:

* I moduli xmlrpclib e SimpleXMLRPCServer creano un'implementazione di una chiamata di una procedura remota all'interno di una quasi sempre insignificante sessione. Malgrado i nomi, non è necessario conoscere o saper gestire XML.

* Il package email è la libreria per gestire i messaggi email, include MIME ed altri messaggi di documenti basati sulla RFC 2822. Diversamente da smtplib e poplib, che attualmente spediscono e ricevono messaggi, questo package email ha un completo insieme di strumenti per realizzare o decodificare complesse strutture di messaggi (inclusi gli allegati) e implementa le codifiche internet ed i protocolli delle intestazioni.

I package xml.dom e xml.sax forniscono un robusto supporto per l'analisi di questo popolare formato di interscambio. Allo stesso modo il modulo csv supporta direttamente la lettura e la scrittura in un comune formato database. Insieme, questi moduli ed i package, semplificano magnificamente l'interscambio dei dati tra applicazioni scritte in Python ed altri strumenti.

* L'internazionalizzazione viene suportata da numerosi moduli, inclusi gettext, locale e dal package codecs.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.