[Python] doctest con funzioni che aprono files

Giovanni Marco Dall'Olio dalloliogm a gmail.com
Mer 26 Nov 2008 17:44:55 CET


Ciao a tutti,
e' da un po' di tempo che utilizzo doctest, e sono felice :).

Lo trovo molto comodo per scrivere funzioni che calcolano statistiche
e parsano particolari formati di files.

Quello che non capisco ancora e' come utilizzarlo per testare funzioni
che prendano in input il nome (path) di un file, e lo aprano.
Qualcosa del genere:
---
>>> def read_first_line(filename):
...     fh = file(filename, 'r')
...     for line in fh:
...         do things...
---

(mi dispiace per il modo in cui gmail formattera' questo messaggio :( ).

Una possibile opzione e' utilizzare StringIO. Il problema e' che gli
oggetti StringIO non hanno un equivalente di un filename che si possa
passare ad una funzione, quindi sono costretto a scrivere moduli che
prendano in input file handlers invece che file names.

---
def read_first_line(fh):
    """
    >>> from StringIO import StringIO
    >>> fh = StringIO('contenuto del file')
    >>> read_first_line(fh)
   contenuto del file
    """"
    print fh.readline()
---

Una seconda opzione e' quella di usare tempfile.NamedTemporaryFile.
Il problema e' che e' una opzione un poco brutta esteticamente, che
aggiunge un sacco di istruzioni non necessarie nella documentazione
(incasinandola).
---
def read_first_line(filename):
    """
    >>> from tempfile import NamedTemporaryFile
    >>> fh = NamedTemporaryFile()
    >>> fh.write('contenuto del file')
    >>> fh.seek(0)
    >>> read_first_line(fh.name)
    contenuto del file
    """
    fh = file(filename)
    print fh.readline()
---

Sul serio, chiedo scusa per la maniera con cui questo messaggio verra'
formattato da google. Se non e' comprensibile, lo posto da qualche
parte.

In parole povere, io sto cercando una funzione che mi permetta di
creare un oggetto simile ad un file, che sia accessibile tramite un
filename, di scriverci dentro del testo, e di riavvolgerlo al primo
bit, e tutto questo in una o due istruzioni.
Qualche suggerimento?


-- 

My blog on bioinformatics (now in English): http://bioinfoblog.it


Maggiori informazioni sulla lista Python