Durante lo sviluppo di Cobra Draugths ho avuto la necessità di trovare un profiler per Python che facesse al caso mio. Dato che non c’è un unico strumento adatto ho deciso di spiegare passo passo come ottenere dei dati di profiling veloci, puliti e graficamente guardabili.

È una guida espressa: niente discussioni, niente commenti, solo fatti e procedure.

Continue reading »

 

Nella scorsa parte abbiamo visto come abilitare l’interfaccia di admin. Abbiamo notato però che non tutto era esattamente come ce lo aspettavamo. Per prima cosa tutte le tabelle terminavano con una fastidiosa “s” dovuta al plurale inglese, secondo, gli oggetti venivano visualizzati con un anonimo “Artista Object”, “Genere Object” e così via.

Per sistemare questi punti c’è un modo molto semplice.

  • Specificare il metodo __unicode__.
  • Aggiungere l’opzione verbose_name_plural come parametro della classe Meta di ogni oggetto del modello.
  • Impostare LANGUAGE_CODE = 'it-IT' nel file settings.py

Il metodo unicode specifica come verrà visualizzato un oggetto del modello X al posto della dicitura standard “X Object”. Per chi conosce il python è praticamente equivalente a ridefinire il metodo speciale __str__[/cc] di una classe (il metodo [cci]__str__ dei modelli Django chiamano proprio __unicode__).

La classe Meta, invece, è una classe speciale che permette di passare ai modelli delle opzioni particolari. Vedremo altre opzioni nel corso del tutorial. L’opzione che ci interessa ora è verbose_name_plural : se questo valore è None allora viene usato il suffisso “s” come nel caso inglese, altrimenti viene usato il valore della variabile.

Vediamo quindi qualche esempio:

class Artista(models.Model):
    nome = models.CharField(max_length=50)
    cognome = models.CharField(max_length=50)
    ruoli = models.ManyToManyField(Ruolo)

    def __unicode__(self) :
      return u"%s %s" % (self.nome, self.cognome)

    class Meta:
      verbose_name_plural = "Artisti"

Mostro il caso del modello “Artista”. Allo stesso modo intervenite anche su tutti i modelli restanti. Potete vedere il risultato in figura.

Come potete vedere adesso il risultato è molto più accettabile. La prossima volta vedremo come abbozzare un interfaccia pubblica al nostro sito.

 

Quando si sviluppa un applicazione web creare pannelli di admin è solitamente noioso e fastidioso eppure necessario per permettere, ad esempio, al gestore del negozio online che stiamo progettando di aggiungere oggetti al catalogo senza dover conoscere una riga di codice o del funzionamento di un DB. Per fortuna Django ci offre una valida scorciatoia: creare un interfaccia admin con Django ci costa solamente una decina di righe di codice.

Per prima cosa abilitiamo il pannello di admin modificando un paio di righe:

  • Decommentiamo la riga django.contrib.admin di INSTALLED_APPS in settings.py
  • Decommentiamo from django.contrib import admin e admin.autodiscover() da urls.py
  • Decommentiamo (r'^admin/', include(admin.site.urls)), da urlpatterns in settings.py

Per ultimo creiamo ex-novo un file admin.py nella nostra apps con questo contenuto:

from django.contrib import admin
from musicdb.models import *

admin.site.register(Artista)
admin.site.register(Genere)
admin.site.register(Ruolo)
admin.site.register(Gruppo)
admin.site.register(Album)
admin.site.register(Traccia)

Poi avviamo il server e andiamo su

http://localhost:8000/admin/

Per accedere al favoloso pannello di amministratore.

La schermata di login del pannello di admin!

La schermata principale del pannello di amministrazione!

Semplice, facile ma estremamente potente. :)

Tuttavia ci sono ancora alcuni difetti. Ad esempio Django pluralizza le parole aggiungendo il suffisso “s” alla parola come nel caso inglese, cosa che non va bene in italiano; inoltre se apriamo una tabella ci troveremo davanti tanti oggetti anonimi come “Artista object”, “Gruppo object” e così via mentre noi vogliamo che ci indichi, ad esempio, nome e cognome di un artista o il nome del gruppo.

Rimuoveremo tutti questi piccoli difetti la prossima volta con alcune piccole modifiche al modello.

 

Come ogni applicazione che si rispetti, abbiamo bisogno di impostare e generare la struttura dati del nostro programma. La primissima cosa da fare è quella di istruire Django ad utilizzare un database.

Per questa guida sceglieremo PostgreSQL. Per configurarlo potete seguire la guida per installare PostgreSQL.

Una volta installato e configurato il database apriamo il file settings.py e cerchiamo la riga DATABASES e modifichiamola nel modo seguente:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'musicdb',
        'USER': 'vostro_nome',
        'PASSWORD': 'password',
        'HOST': '',
        'PORT': '',
    }
}

Dove vostro_nome e password sono l’username e la password che avete impostato nella fase di configurazione del database. Inoltre dovete creare preventivamente un database di nome “musicdb”. Per completezza spieghiamo tutti i parametri:

  • ENGINE è il modulo di django di backend che si interfaccia con lo specifico database. Scegliamo quello del nostro database.
  • NAME è il nome del database o del file nel caso di SQLite.
  • USER è il nome utente per l’accesso al db (non serve nel caso di SQLite).
  • PASSWORD è la password di accesso.
  • HOST e PORT sono i dati che indicano la posizione e la porta di accesso a db nel caso il database non sia sulla stessa macchina del server.

Assicuratevi anche che sia installato il pacchetto:

python-psycopg2

Necessario per far interfacciare python al DB.

A questo punto non ci resta che creare lo schema del database. Per fare ciò apriamo il file models.py e inseriamo una cosa del tipo:

from django.db import models

# Create your models here.
class Ruolo(models.Model) :
    descrizione = models.CharField(max_length=30)

class Artista(models.Model):
    nome = models.CharField(max_length=50)
    cognome = models.CharField(max_length=50)
    ruoli = models.ManyToManyField(Ruolo)

class Gruppo(models.Model):
    nome = models.CharField(max_length=50)
    membri = models.ManyToManyField(Artista)

class Genere(models.Model):
    descrizione = models.CharField(max_length=30)

class Traccia(models.Model):
    nome = models.CharField(max_length=50)
    durata = models.TimeField()

class Album(models.Model):
    nome = models.CharField(max_length=50)
    gruppo = models.ForeignKey(Gruppo)
    genere = models.ForeignKey(Genere)
    data = models.DateField()
    tracce = models.ManyToManyField(Traccia)

Questo file specifica la struttura delle tabelle del database. Tutto senza scrivere una sola riga di SQL. Vediamo un po il significato di alcuni campi:

  • CharField è un campo di testo semplice. Il parametro max_length specifica il numero massimo di caratteri memorizzabili nel campo.
  • ForeignKey specifica un collegamento uno-a-molti verso un altra tabella. Ad esempio un Album ha un unico Gruppo che lo suona ma un Gruppo può avere uno o più Album nella propria discografia.
  • DateField specifica una data.
  • TimeField specifica un tempo.
  • ManyToMany specifica un collegamento molti-a-molti verso un altra tabella. Ad esempio un Gruppo può avere uno o più Artisti che ne fanno parte, ma un Artista può partecipare a uno o più gruppi.

Ora, rendiamo questo modello un database vero e proprio con il comando:

python manage.py syncdb

Se tutto è andato a buon fine e il modello è valido ci verrà chiesto se vogliamo creare una zona del database per gli utenti. Diciamo di si. Ci verrà chiesto di creare il super-user, creiamolo indicando un nome e la password.

A questo punto possiamo provare il nostro database.

Apriamo la shell di django con

python manage.py shell

E all’interno digitiamo:

from musicdb.models import *
freddie = Autore(nome="Freddie, cognome="Mercury")
freddie.save()

Con pgAdmin3 possiamo facilmente vedere che il cantante è stato aggiunto nella giusta tabella.

Ebbene si. Freddie c'è.

 

Continuiamo il nostro tutorial che ci porterà a implementare una semplice applicazione web per gestire la nostra collezione musicale.

Ora che la base funziona dobbiamo iniziare a scrivere qualcosa di più complesso che una misera pagina di default. A questo scopo ci servono le viste. Le viste non sono altro che quella parte di programma che si occupa di recuperare tutte le informazioni necessarie alla visualizzazione della pagina che poi verranno passate ad un template in modo da essere trasformate in pagine web a tutti gli effetti. Solitamente le viste interrogano un database per recuperare i dati, questa volta invece cominceremo da una semplice vista di test.

La prima cosa da fare è creare una nuova applicazione che chiameremo musicdb in quanto sarà il centro vero e proprio della web application. Un sito complesso è solitamente composto da una o più applicazioni collegate fra loro. Piccoli siti, come quello che stiamo per fare, utilizzano solo un applicazione. Per fare questo, all’interno della cartella principale del sito, digitiamo:

django-admin startapp musicdb

Questo creerà un ulteriore cartella che contiene altri 4 file.

  • __init__.py Sempre il solito file init.
  • models.py Contiene i “modelli” ovvero la struttura del database espressa in python tramite le API di Django.
  • tests.py Contiene dei test per valutare la correttezza di query, associazioni, modelli e viste.
  • views.py Contiene le viste, ovvero quelle funzioni che si occupano di processare le richieste dell’utente generando dei contenuti (tramite i template) che verranno poi inviati al browser.

La seconda cosa da fare è aggiungere la nostra applicazione alle applicazioni del sito. Andiamo nel file “settings.py” e aggiungete ‘musicdb’ alle applicazioni in questo modo:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    'musicdb',
)

Poi dobbiamo scrivere una vista di prova. Andiamo nel file “views.py” dell’applicazione musicdb e inseriamo il seguente codice:

from django.http import HttpResponse

def view_test(request) :
    return HttpResponse("
<h1>Ciao! Questa è la tua applicazione!</h1>
"
)

Ora, dobbiamo solo collegare un URL a questa vista e quindi andiamo nel file “urls.py” e modifichiamo “urlpatterns” in questo modo:

urlpatterns = patterns('',
    # Example:
    # (r'^musicz/', include('musicz.foo.urls')),

    # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    # (r'^admin/', include(admin.site.urls)),
    ( r'^test/$', "musicdb.views.view_test"),
)

Il primo elemento della tupla è una espressione regolare che serve ad intercettare l’url e a indirizzarlo alla funzione indicata come secondo elemento della tupla.

A questo punto non ci resta che testare tutto. Avviamo il server (python manage.py runserver) e andiamo all’indirizzo http://localhost:8000/test/. Quello che ci troviamo davanti dovrebbe essere una pagina come quella in figura.

Che bello! Funziona!

 

Vi propongo passo passo un tutorial che ci porterà a realizzare una pagina web dinamica contenente informazioni sulla nostra collezione musicale. In questo modo potrete vedere come prende forma un progetto utilizzando quella meraviglia tecnologica che è Django. Gli unici requisiti sono la conoscenza del Python nella sua forma base (for, if, classi, funzioni, tuple, liste e dizionari). Non ci resta che iniziare a impostare la cartella del progetto e verificare che tutto funzioni.

La prima cosa da fare è andare in una cartella e digitare:

django-admin startproject musicz

Verrà creata una cartella di nome musicz che contiene 4 file.

  • __init__.py è il file che indica all’interprete python di trattare la cartella come un package. Il file è solitamente vuoto e vuoto deve solitamente rimanere.
  • manage.py è un file di servizio che vi offre un interfaccia molto comoda ad alcune “utility” di Django. Ne faremo largamente uso da ora in avanti.
  • setting.py è il file che contiene tutti i settaggi che faremo all’applicazione.
  • urls.py è il file che contiene la specifica mappatura degli urls verso le funzioni del programma.

La cartella contenente i nostri 4 file.

Se tutto è stato fatto correttamente vi basterà digitare

python manage.py runserver

Per avviare il web-server di prova. A questo punto non vi resta che andare all’indirizzo http://localhost:8000/ per vedere un rassicurante messaggio da parte di Django.

Django ci dice che va tutto ok!

 

Come già saprà chi mi segue su Twitter, questa settimana in uno dei miei lampi mi è venuta l’idea di approcciarmi alle web application. Quando uno si affaccia a questo panorama la scelta sembra quasi obbligata: PHP. Tuttavia non avevo voglia di mettermi a studiare intensamente il PHP, sia perché lo trovo sintatticamente bruttino sia per voglia di esplorare degli orizzonti più nascosti.

Così, conoscendo il Python piuttosto bene e conoscendo l’esistenza di Django, mi sono chiesto: perché non approfondire un po questo framework? Detto fatto.

La prima cosa da fare era girare su Google per cercare una specie di guida introduttiva. Ne ho trovate parecchie, tuttavia nessuna che spiegasse in realtà come si potesse installare Django su linux senza perderci mezza giornata. Ho dovuto svelare l’arcano leggendo sui forum e scoprire che è una cavolata immensa:

apt-get install python-django

Fine. Nulla più nulla meno. Nessuna configurazione astrusa, compilazioni varie e configurazioni di server. Basta digitare il comando e il sistema fa tutto da solo. Una volta installato possiamo provarlo. Andiamo in una cartella e digitiamo:

django-admin startproject esempio

Poi entriamo nella cartella e digitiamo:

python manage.py runserver

Per avviare il nostro leggero server di sviluppo (non serve configurare server imponenti come Apache, Django offre di suo un server per provare i vostri siti). Quindi andiamo alla pagina http://127.0.0.1:8000/ per ricevere la conferma che Django è perfettamente installato e configurato.

Tutto qui. Per chi volesse imparare ad usare Django (oltre che a installarlo) può visitare questo ottimo libro on-line: http://www.djangobook.com/en/2.0/

 

Prima di cominciare a spiegare il piccolo codice di esempio è importante fare qualche piccola premessa. La fluidità dell’animazione dipende dai frame per secondo (fps). I frame per secondo massimi dipendono dal refresh dello schermo. Gli schermi moderni vanno all’incirca a 60Hz, e quindi che in un secondo lo schermo proietta 60 immagini. Questo significa che ogni secondo possiamo rappresentare al massimo 60 immagini differenti e, quindi, possiamo avere al massimo 60fps.

Andare a 60fps, inoltre, significa che in un sessantesimo di secondo il nostro pc deve calcolare tutti i vertici dell’immagine successiva, inviarli alla scheda video e renderizzarli. Nel caso in cui l’elaborazione necessita più di un sessantesimo di secondo dobbiamo inserirci nell’intervallo successivo, ovvero due sessantesimi di secondo. In questo caso la nostra animazione crolla a 30fps (60/2). Se nemmeno due sessantesimi di secondo sono sufficienti allora passiamo a tre sessantesimi facendo abbassare i nostri fps a 20 (60/3) e così via.

Data la presenza di questi intervalli fissi il tempo di calcolo che “avanza” alla funzione Display viene occupato dalla funzione Idle. Questa è la funzione che viene eseguita quando nessun’altra funzione deve essere eseguita.

Il secondo punto è la presenza del doppio buffer. Usando un solo buffer infatti c’è il rischio che i vertici da visualizzare vengano modificati ancor prima di essere completamente renderizzati sullo schermo. Questo rischia di creare un fastidioso “effetto-fantasma” causato dalla coesistenza sullo schermo di due frame incompleti. Per ovviare a questo tutte le schede video moderne implementano il doppio buffer: secondo questo sistema un buffer viene utilizzato per la visualizzazione mentre il secondo viene utilizzato dal programma per immagazzinare i vertici del prossimo frame. Quando arriva il momento della visualizzazione questi due buffer vengono scambiati. In questo modo è garantito che vengano visualizzati solo frame completi.

from OpenGL.GLUT import *
from OpenGL.GL import *

spin = 0

def init():
    glClearColor(0,0,0,0)
    glShadeModel(GL_FLAT)

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glPushMatrix()
    glRotatef(spin, 0, 0, 1)
    glColor3f(1, 1, 1)
    glRectf(-25, -25, 25, 25)
    glPopMatrix()
    glutSwapBuffers()

def reshape(w, h):
    glViewport(0, 0, w, h)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(-50, 50, -50, 50, -1, 1)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

def spinDisplay():
    global spin
    spin += 0.5
    if spin > 360 :
        spin = spin - 360
    glutPostRedisplay()

def mouse(button, state, x, y) :
    if button == GLUT_LEFT_BUTTON :
        if state == GLUT_DOWN :
            glutIdleFunc(spinDisplay)
    elif button == GLUT_MIDDLE_BUTTON:
        if state == GLUT_DOWN :
            glutIdleFunc(None)

if __name__ == '__main__':
    glutInit()
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
    glutInitWindowSize(250, 250)
    glutInitWindowPosition(100, 100)
    glutCreateWindow("Quadrato Rotante")
    init()
    glutMouseFunc(mouse)
    glutDisplayFunc(display)
    glutReshapeFunc(reshape)
    glutMainLoop()

Questo programma fa due cose in più rispetto al precedente: fa ruotare il quadrato e permette di attivare/disattivare la rotazione con la pressione di due tasti del mouse (il centrale stoppa mentre il sinistro avvia).

Molte funzioni sono le stesse dell’ultima volta quindi non mi ripeterò. Vediamo le novità.

Innanzitutto potete notare che utilizzo GLUT_DOUBLE in DisplayMode. Questo serve ad attivare il doppio buffer.

Poi c’è la funzione glutMouseFunc() che serve ad impostare la funzione che servirà a gestire l’input del mouse. In questo caso ho usato una fantasiosa funzione mouse. Tale funzione prende quattro parametri:

  • button: indica quale bottone è stato premuto.
  • state: indica lo stato (premuto, alzato, click, etc…) vedremo più avanti queste cose in dettaglio.
  • x e y: sono, ovviamente, la posizione del puntatore.

Nella funzione mouse faccio una sola cosa: verifico quale tasto è stato premuto e a seconda del tasto modifico la funzione di Idle. Perché è la funzione IDLE che modifica i frame. La funzione display li mostra, la funzione IDLE li modifica (modificando i parametri utilizzati da display). Questo è il punto fondamentale.

Come potete vedere sposto la funzione di idle con il comando glutIdleFunc. La imposto a None (o NULL in C) per fermare il quadrato e alla funzione spinDisplay per ruotarlo. Quest’ultima funzione non fa altro che incrementare una variabile spin che rappresenta i gradi di rotazione.

La funzione display è del tutto simile a quella dell’esempio precedente. Viene aggiunta però la funzione glRotate la quale non fa altro che ruotare di spin gradi tutti i vertici che verranno inseriti fra glPushMatrix e glPopMatrix.

Un altra cosa accessoria è la funzione glutReshapeFunc che imposta la funzione da chiamare nel momento in cui la finestra viene ridimensionata. In questo caso la funzione evita solamente che vengano alterate le proporzioni.

EDIT: È disponibile la versione in C del codice di questa puntata. Lo trovate questo indirizzo

 

Stavo ripassando gran parte delle API delle OpenGL. Stavo facendo piccoli schemi e riassunti ed allora ho pensato: perché non condividere un po’ di questo lavoro? Così ci trascrivo qualche piccolo cenno di OpenGL senza nessuna intenzione di portare alla luce chissà quale serie di tutorial. Se poi esce qualcosa di appetibile meglio così.

Innanzitutto devo fare due appunti: il primo è che, per mia semplicità, userò il Python come linguaggio per il codice, tuttavia le API sono identiche sia in pyOpenGL che nell’OpenGL standard quindi anche se programmate in C potete facilmente convertire il tutto nel linguaggio a voi più familiare. Secondo, le libreria OpenGL prese da sole sono un po’ complicate, infatti di solito ci si appoggia alle librerie collegate GLUT. Queste librerie si incaricano di fare tutto il lavoro “esterno” alla visualizzazione grafica come gestione degli input e integrazione nel sistema a finestre. Usare GLUT è proprio l’approccio che userò anche io.

Iniziamo mostrando un piccolo programma che disegna un quadrato bianco su uno sfondo nero.

from OpenGL.GLUT import *
from OpenGL.GL import *

def init():
glClearColor(0,0,0,0)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0,1,0,1,-1,1)

def display():
glClear(GL_COLOR_BUFFER_BIT)
glColor3f(1,1,1)
glBegin(GL_POLYGON)
glVertex3f(0.25, 0.25, 0)
glVertex3f(0.75, 0.25, 0)
glVertex3f(0.75, 0.75, 0)
glVertex3f(0.25, 0.75, 0)
glEnd()
glFlush()

if __name__ == '__main__' :
glutInit()
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
glutInitWindowSize(250, 250)
glutInitWindowPosition(100, 100)
glutCreateWindow("Hello World")
init()
glutDisplayFunc(display)
glutMainLoop()

Partiamo quindi a spiegare il codice cominciando da l main. La prima funzione che incontriamo è glutInit(). Questa funzione si incarica di inizializzare GLUT. La versione canonica di questa funzione prende per argomento gli argomenti del main (argc e argv per chi conosce il C).

La seconda funzione è glutInitDisplayMode(). Questa funzione prende per parametri delle opzioni di visualizzazione. Nel nostro caso GLUT_SINGLE e GLUT_RGB i quali impostano la visualizzazione a singolo buffer (capiremo la differenza con il doppio buffer la prossima volta) e la visualizzazione RGB (ovvero con i colori tradizionalmente usati nei pc).

Gli altri tre comandi invece creano la finestra impostandone dimensione, posizione e titolo.

A questo punto entriamo in init(). In questa funzione vengono preimpostate alcune variabili di OpenGL. Non entrerò nel dettaglio ora, vi basti sapere che glClearColor() è la funzione per il colore di “sfondo” ovvero per quello usato durante la cancellazione. Questa funzione prende 4 parametri (rosso, verde, blu e trasparenza).

Un altra funzione importantissima è glutDisplayFunc() questa è la funzione che indica al motore grafico quale funzione chiamare nel momento in cui c’è bisogno di disegnare sullo schermo. In questo esempio passiamo semplicemente la funzione display la quale non fa altro che disegnare un quadrato bianco.

Come? Semplice. Per disegnare qualcosa bisogna passare al sistema le coordinate dei vertici secondo un algoritmo del tipo:

  • Si imposta il colore.
  • Si avverte il sistema che stiamo inserendo i vertici con glBegin().
  • Si passano le coordinate dei vertici con glVertex3f()
  • Si avverte il sistema che abbiamo terminato con glEnd()

Il parametro di glBegin è molto importante ma capiremo meglio il suo significato successivamente.

La funzione glFlush() è inutile per molte applicazioni. Ma voi mettetela. Così sarete sicuri che il vostro codice funzioni, ad esempio, in applicazioni di rete.

Alla fine, per chiudere in bellezza si lancia glutMainLoop() per avviare il programma.

Questo è solo un piccolo esempio. Disegnare un quadrato immobile non è ne bello ne utile. Ma questo esempio, nella sua semplicità, racchiude l’essenza di ogni programma OpenGL. La prossima volta vedremo come far ruotare questo dannato quadrato.

 


Python dispone di numerosissimi strumenti che facilitano e completano l’esperienza di programmazione. Il problema è, appunto, che sono troppi. Ogni volta bisogna ricercare i migliori fra la sterminata costellazione di strumenti di sviluppo.

E quindi ho deciso di fare una lisa. Soprattutto per me, dato che ogni volta che mi capita di reinstallare il sistema perdo un bel po’ di tempo a ricordarmi quali fossero tutti i tools che avevo installato.

IDE

La scelta dell’IDE è sempre la più importante. Sebbene Python non necessiti di chissà quale IDE avanzato, un po’ di comodità in più non fa certo male. La mia scelta ricade a pari merito su due IDE molto importanti:

Per il momento sto utilizzando la seconda configurazione ma in passato ho usato la prima. A voi la scelta.

CHECKER

Python è un linguaggio interpretato, ragion per cui gran parte degli errori di sintassi vengono fuori solamente in fase di esecuzione. Ci sono però programmi in grado di individuarli da subito.

Questa è la mia scelta. Fa tutte le cose di PyChecker e, in aggiunta, fa anche alcuni controlli riguardo le convenzioni stilistiche di Python. Un ottimo “tutor”. Inoltre è integrato con PyDev, quindi se usate Eclipse è veramente una mano santa.

DEBUGGER

Il debug in python è integrato. Basta importare il modulo pdb e lanciare il programma con:

<span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; font-size: 12px; white-space: pre;">pdb.run('mymodule.test()')

Vi rimando alla guida ufficiale per maggiori informazioni.

TESTING FRAMEWORK

Gli ambienti di test sono strumenti che permettono di scrivere dei test per verificare il buon funzionamento di una classe o di un modulo che abbiamo appena scritto. In Java io utilizzavo JUnit. È quindi naturale che in Python abbia scelto:

PyUnit ricalca molto da vicino la sintassi di JUnit. Inoltre è integrato con Eclipse. Per test semplici è veramente intuitivo, per roba più complessa basta dare una letta alla documentazione.

CODE COVERAGE

Gli strumenti di code coverage sono tools che tengono traccia di quale parte di codice eseguiamo durante un test e di quale non eseguiamo. È molto facile infatti che durante un test capiti di trovarsi ad eseguire, ad esempio, solamente un ramo di un IF e che, come al solito, l’errore si nasconda nel ramo che non eseguiamo mai. I programmi di code coverage ci segnalano proprio questa eventualità.

Questo è il programma di coverage in Python per eccellenza. Integrata con PyDev. Esiste anche un espansione (figleaf) che però non ho mai avuto modo di provare.

DOCUMENTAZIONE

Scrivere la documentazione è essenziale. Generare la documentazione dai commenti del codice sorgente è ancora più essenziale in quanto ci risparmia una marea di tempo. In Java esiste il famoso javadoc. Ovviamente il Python non è da meno.

Epydoc, di cui ho scritto anche una rapida guida tempo fa, è un tool fenomenale. Non è perfettamente integrato con Python 3 (almeno nell’ultima versione che ho usato) ma fa dannatamente bene il suo lavoro.

Credo che per il momento la lista sia piuttosto esaustiva. Spero vi sia utile.

Alla prossima. :)

© 2008-2012 SlashCode Suffusion theme by Sayontan Sinha