Pylint è uno static checker per Python. Ma fa anche di più.

Pylint non solo ci segnala tutti gli errori di sintassi ma ci indica anche quali convenzioni sul codice abbiamo infranto, dove manca l’adeguata documentazione e se il codice è adeguatamente commentato. Oltre a questo è possibile inserirein Pylint dei plugin per effettuare dei test personalizzati.

Dopo aver installato il rpgramma con

# apt-get install pylint

Ci basta avviarlo con

$ pylint nomescript.py

Il programma ci restituirà una dettagliata lista di warning, error e mancate convenzioni. Alla fine ci restituirà anche un punteggio, compreso fra 0 e 10 (ma vi assicuro che va anche in negativo xD ) che indica la “qualità” del codice. Ovviamente è solo un valore indicativo basato sulla sintassi. Ma è utile per istruire i novellini all’uso di documentazione, commenti e rispetto delle convenzioni. :)

 

La buona programmazione è merce rara. Frotte di programmatori al grido di “basta che funziona” popolano la rete. Hanno codice non commentato, arrabattato, non modulare in cui una classe svolge funzioni di altre classi e non ci si capisce nulla. Evitiamolo.

Le motivazioni sono molteplici: miglior debug, risoluzione dei bug, facilità nella portabilità, estendibilità, maggior comprensione del codice per chi volesse aiutarvi e molto altro.

Un elemento fondamentale di questa programmazione elegante è l’information hiding. Parlerò in dettaglio dell’information hiding nel mio progetto GaPG, vi basti sapere, se non ne siete a conoscenza, che per information hiding si intende la pratica di “nascondere” gli attributi di una classe e renderli accessibili solo tramite funzioni pubbliche chiamate setter, getter e in alcuni linguaggi anche deller.

Ovviamente non devono esistere tutte queste funzioni ogni volta. Sicuramente vogliamo che il nostro attributo sia accessibile all’esterno, quindi sicuramente metteremo sempre un getter. Ma potremmo volere che un certo attributo sia immutabile o, comunque, non possa essere modificato a piacere dall’esterno, e quindi non forniremo tramite attributo di un setter, rendendo così impossibile la modifica esterna.

Questo atteggiamento è spesso incompreso dai programmatori novelli. Essi infatti pensano che sia soltanto una forma di pornografia informatica, un feticismo da nerd. Grave. L’information hiding è la migliore contromisura per ogni sorta di bug. Impedire l’accesso solo a dati “puliti” è essenziale. Tramite un setter ad esempio possiamo controllare che il valore inserito rientri nel range di validità del valore, ad esempio, impedendo che il campo età di Persona possa essere impostato con un età negativa.

Python pecca parecchio da questo punto di vista. E questo è probabilmente il punto debole più vistoso di python. Così nelle versioni si è cercato di “pezzarlo” come si poteva. Python infatti non distingue fra attributi pubblici e attributi privati. Assume che siano sempre pubblici.

Una convenzione molto usata consiste nel anteporre all’attributo un doppio underscore ( _ _ ) in modo da segnalare che quell’attributo è privato. Ad esempio:

class CartaDaGioco():

    def __init__(self,seme,valore):
        self.__seme = seme
        self.__valore = valore

Ma il concetto di privato inserito in questo modo è del tutto relativo. L’unica cosa che fa l’interprete per rendere più scomodo l’accesso a tali attributi è di rinominarli in _CartaDaGioco__seme e in _CartaDaGioco__valore. Questi metodi però restano accessibili per chi ne conosce il nome e sono ancora una forte tentezione.

Python offre però un metodo interessante per disincentivare ulteriormente l’uso scorretto dell’information hiding, offre la possibilità di gestire come se fosse un attributo setter e getter tramite delle variabili “virtuali”. Ma un esempio chiarirà di molto questo concetto in apparenza complesso.

class CartaDaGioco()
    def __init__(self,seme,valore):
        self.__seme = seme
        self.__valore = valore

@property
def valore(self):
return self.__valore

@valore.set
def valore(self,newseme):
if 1<=newseme<11 : self.__valore = newseme

In questo modo, tramite l’uso del decoratore property abbiamo creato un attributo virtuale valore associato all’attributo reale __valore. In questo modo possiamo accedere alla variabile come fosse un normale attributo:

>>> a = CartaDaGioco('bastoni',7)
>>> print(a.valore)
'7'
>>> a.valore = 9
>>> print(a.valore) # il valore è stato modificato perché è un valore valido.
'9'
>>> a.valore = -20
>>> print(a.valore) # il valore non è cambiato perché -20 non è un valore valido.
'9'

Come potete vedere, sebbene l’utilizzo di valore sia completamente uguale all’uso di un attributo abbiamo inserito un “vincolo” ai valori di valore ridefinendo il suo setter. Non specificando nessun setter, inoltre, quando proviamo a scrivere sull’attributo virtuale, ci viene restituito errore. Proprio come volevamo per creare un attributo immutabile.

Il decoratore property permette inoltre di creare attributi fittizi il cui valore è dato dalla combinazioni di attributi reali. Ad esempio se la classe Dipendente ha come unico attributo il campo stipendio possiamo definire con @property un attributo stipendioannuale che restituirà il valore di stipendio moltiplicato per 12.

Insomma. L’uso di property non è obbligatorio ma fornisce quel tocco di eleganza alla vostra programmazione.

Per maggiori informazioni vi rimando alla documentazione ufficiale. :)

Alla prossima.

 

Java aveva un lato positivo. C’era una cosa che mi piaceva: javadoc. Ovvero un sistema per generare automaticamente una dettagliata e affascinante pagina web con la descrizione e la documentazione di ogni parte di codice scritto basandosi su alcuni speciali commenti del codice.

Ma io non sono un programmatore Java (dio me ne scampi) ma, fra i molti linguaggi, mi diverto con il Python. Così ho cercato in lungo e in largo un sistema che svolgesse le stesse funzioni di Javadoc. E l’ho trovato.

Python dispone di molti tool del genere, quindi ne ho provati un po, fino a far ricadere la mia scelta su Ephydoc. Ephydoc non solo svolge tutte le funzioni di javadoc ma è molto più potente e versatile.

Innanzitutto per istallarlo, come ormai sappiamo, digitiamo dal terminale:

# apt-get install python-epydoc

A questo punto il programma è pronto per essere utilizzato. L’importante è commentare il nostro codice seguendo delle piccole cose a mente.

Innanzitutto epydoc sfrutta la docstring standard di Python. Dovete sapere che Python integra nativamente un piccolo sistema di documentazione nel codice. Infatti proviamo a scrivere una funzione in questo modo:

def codice_esatto(code):
    """
    Verifica se il codice inserito è corretto.
    """
    if codice=="4 8 15 16 23 42" :
        return true
    else :
        return false

Il testo racchiuso fra le triple virgolette è una stringa che descrive la funzione codice_esatto. Infatti digitando dall’interprete:

>>> print codice_esatto.__doc__

Ci viene restituito proprio il testo fra virgolette.

Epydoc sfrutta proprio questo testo per comporre la pagina web e inoltre è possibile aggiungere alcuni elementi di markup per rendere la documentazione più elegante.

Per una guida completa alla documentazione vi rimando alla pagina ufficiale del manuale di epydoc dove ci sono molti esempi di facile interpretazione. Qui di seguito aggiungo una serie di tag di frequente utilizzo:

  • @param p: Descrizione del parametro p
  • @type p: Tipo del parametro p
  • @return: Descrizione del valore restituito.
  • @rtype: Tipo del valore restituito.
  • @raise e: Descrizione sulle circostanze in cui viene lanciata l’eccezione e

Per il resto rimando sempre al sito ufficiale.

Una volta che abbiamo commentato tutti i nostri file (dovrebbero essere già commentati. Se non lo sono aih aih aih, è la regol aprima del programmatore) non ci resta che lanciare epydoc con:

epydoc file1.py file2.py ... fileN.py

Alla fine troveremo tutta la nostra documentazione nella cartella html. Buona lettura :)

 

INDENTAZIONE

Innanzitutto l’indentazione è una di quelle cose che distingue Python da ogni altro linguaggio poiché non è solo una “convenzione” per rendere leggibile il codice ma una vera e propria regola da seguire senza la quale l’interprete segnalerà inesorabilmente errore.

L’indentazione apre e chiude un blocco di codice: quando l’indentazione cresce di un livello si apre il nuovo blocco, quando l’indentazione diminuisce si chiude il blocco.

def unCodiceMaleIndentato :
	"Questo è il livello 1"
		"Questo è il livello2"
	"Questo è di nuovo il livello1"

L’esempio qui sopra riportato rappresenta 2 blocchi di codice: il blocco 1 che rappresenta il corpo di def (vedremo subito dopo cosa significa) che a sua volta contiene il blocco 2.

Continue reading »

 
Il bellissimo logo di Python.

Il bellissimo logo di Python.

Come si dice in questi casi “a grande richiesta” comincierò a parlare di Python e cercherò di farlo nel modo più “pratico” possibile.

Premetto che parlerò di questo linguaggio alla luce delle 10 lezioni sulla programmazione generale quindi per chi non le ha lette, consiglio di recuperare!

Detto questo iniziamo subito a dire cos’è Python. Python è un linguaggio di script interpretato con paradigma ad oggetti dotato di una tipizzazione forte dinamica (capire questa frase punto per punto è anche un utile esercizio per vedere se avete chiari i concetti precedenti xD).

Continue reading »

© 2008-2012 SlashCode Suffusion theme by Sayontan Sinha