Plugin Geany: Python Good Code

Chi conosce Geany saprà che esso è un ottimo IDE, multipiattaforma, leggero e non specifico che pertanto si presta allo sviluppo di progetti scritti in linguaggi di programmazione diversi tra loro. Grazie a questa sua dinamicità da diversi anni lo uso ormai come ambiente di sviluppo per tutti i miei progetti, siano essi scritti in PHP, Python, C e Stallman solo sa quale altre linguaggio. Essendo un IDE non specifico, Geany dà la possibilità agli sviluppatori di tutto il mondo di scrivere plugin per il software che ne estendono le features di base.

Dovendo, per lavoro e per diletto, scrivere molto codice in Python e rilasciando poi quanto scritto con licenze GPL et simila, molto spesso mi ritrovo ad effettuare lavori di revisione del codice per fare in modo che lo stesso si adatti agli standard dello stile PEP8, ovvero una serie di linee guida comuni da seguire per scrivere del codice uniforme e standard che sia facilmente interpretabile da tutto il mondo degli sviluppatori Python. Fortunatamente esistono dei tool da linea di comando che permettono di analizzare direttamente un listato e di ottenere dei messaggi lì dove una linea di codice non corrisponde agli standard. Dover uscire dal proprio ambiente di lavoro per poter usare questi tools è molto scomodo poiché sfavorisce la continuità e crea possibili distrazioni oltre che perdite di tempo. Data questa premessa ho deciso di creare un plugin per Geany che permette l’analisi del proprio codice direttamente dall’interno del software.

Il plugin si chiama Python Good Code.

Python Good Code permette, una volta installato, di ottenere una voce di menu che analizza al volo il codice e restituisce i messaggi di errore nella comoda finestra dei messaggi di Geany. In questo modo basterà cliccare sulla stringa di errore per essere portati con il puntatore direttamente sulla riga oggetto del messaggio all’interno del codice. Tra le feature del plugin troviamo:

  • Menu rapido per l’analisi del codice
  • Scorciatoia da tastiera configurabile per il richiamo del suddetto menu
  • Tool di analisi configurabile (di default verrà impostato flake8)
  • Possibilità di generare un file di report in cui salvare i messaggi di errore
  • Click rapido per l’evidenziazione della linea di codice soggetta all’errore

INSTALLAZIONE

L’installazione del plugin è molto semplice. Basta scaricare il sorgente dal repository GitHub, spostarsi all’interno della cartella appena scaricata e seguire le istruzioni riportate nel file INSTALL.

CONFIGURAZIONE

Una volta installato il plugin, all’interno del menu Strumenti -> Gestione Plugin sarà possibile trovare la voce Python Good Code. Abilitando la spunta si abilita il plugin stesso. A questo punto la voce Preferenze sarà abilitata e sarà possibile così impostare le voci presenti.

geany python good code preferenze

Per la configurazione delle scorciatoie da tastiera, invece, bisognerà recarsi in Modifiche -> Preferenze -> Scorciatoie da Tastiera e alla voce Python Good Code / Launch Python Analisys Tool effettuare un doppio click e digitare la combinazione di tasti che si preferisce utilizzare.

geant python good code scorciatoie tastieraUSO

Mediante la scorciatoia da tastiera configurata o cliccando sul menu Strumenti -> Python Good Code sarà possibile analizzare il codice Python aperto nella tab in focus nell’IDE. Eventuali messaggi verranno mostrati nella finestra dei messaggi di Geany

python-good-code-messaggi

python-good-code-messaggi-click-rapido

Python: filtrare le liste

Le liste, si sa, sono croce e delizia di ogni programmatore e saperle usare rende il lavoro di gestione dei dati nel codice molto più comodo e semplice. Tutto, in un certo senso, può essere logicamente ricondotto ad una lista e pertanto questo tipo di dato è molto utilizzato in tutti i listati.
La nostra attenzione questa volta si sofferma su python e sulla possibilità che il linguaggio offre di filtrare rapidamente le liste.
Immaginiamo di avere una lista di anni così strutturata:
anni = [1989, 1987, 1956, 1820, 1452, 1999, 2006, 1756]
e di voler filtrare solo gli anni che vengono dopo il 1900. Normalemente si opererebbe con una struttura sintattica simile alla seguente:
nuova_lista = []
for anno in anni:
    if anno > 1900:
        nuova_lista.append(anno)
        print 'Vecchia lista:', anni
        print 'Nuova lista:', nuova_lista
Come si può ben vedere il codice è semplice e pulito e svolge bene il suo lavoro ma è possibile minimizzare ed ottimizzare ancora un codice già così sintetico? La risposta ovviamente è si ed ora vedremo come trasformare il nostro snippet:
nuova_lista = [anno for anno in anni if anno > 1900]
print 'Vecchia lista:', anni
print 'Nuova lista:', nuova_lista
Si vede già da subito che il numero di righe è stato nettamente ridotto e tutta la struttura sintattica del precedente codice è stata ridotta grazie all’uso delle mappature di python unitamente al nostro filtro. In pratica la nostra nuova riga di codice si occupa di ciclare gli elementi nella lista (mediante il ciclo for) e di confrontare l’elemento ottenuto con il filtro desiderato (mediante if). Ovviamente se il confronto con il filtro risulta vero allora l’elemento viene mappato nella nuova lista con il risultato di ottenere un array contenente i dati voluti.
Scrivere del buon codice significa ottenere, alla fine del nostro lavoro, un listato più pulito e quindi più semplice da correggere in caso di errori. In questo caso abbiamo visto come sia semplice adoperare le liste in maniera molto più fluida e sicuramente più pulita.

ReportLab e Python: Creare codici a barre

Come abbiamo avuto modo di vedere, mediante l’uso della libreria offerta da ReportLab, è possibile creare in maniera molto flessibile dei PDF che soddisfino tutti le nostre necessità. Ora però, una volta capito come creare un documento, abbiamo la necessità che esso venga riempito con qualcosa di utile. 
In ogni contesto lavorativo, e quindi a maggior ragione in un contesto industriale come quello oggetto d’esame nello scorso articolo, la praticità che l’informatica può offrire, è lo strumento migliore che aiuta l’utente a disfarsi di un grosso carico di lavoro ritenuto inutile. Dotare il proprio documento di un codice a barre può servire per effettuare numerose operazioni utili nel futuro come  ricerche, organizzazione di documenti, generazione di riferimenti rapidi da riportare su eventuali documenti cartacei, etc…

Ora vediamo come sfruttare ReportLab per creare un codice a barre da inserire nel nostro documento.
Il codice da esaminare è il seguente:

—– Python —–
#!/usr/bin/env python

from reportlab.pdfgen import canvas (1) 

from reportlab.lib.units import mm (2)
from reportlab.graphics.barcode import code39 (3)

mio_pdf = canvas.Canvas(‘mio.pdf’) (1)
# —– imposta le dimensioni

mio_pdf.setPageSize((204, 65)) (1)

# —– genera ed imposta il barcode
barcode = code39.Extended39(‘1234’, barWidth=0.5*mm,barHeight=8*mm) (4)
barcode.drawOn(mio_pdf, 10*mm, 10*mm) (5)

# —– genera e salva il pdf
mio_pdf.showPage() (1)
mio_pdf.save() (1)
———-
 
Anche questa volta, il sorgente da analizzare è molto semplice e racchiude solo lo stretto necessario affinché venga compreso l’uso dei codici a barre. 
Il codice che è già stato esplicato nel precedente articolo (1) non verrà ritrattato e pertanto vi invito ad una rilettura del precedente post per comprenderne il significato ed il comportamento.
Innanzitutto partiamo dall’inclusione di una nuova voce (2) che ci permette di convertire al volo tutte le unità di misura (che vengono richieste in pollici) in millimetri. In questo modo la generazione dei documenti ed il calcolo delle misure risulterà molto più semplice ed immediata. Successivamente (3) è presente la vera e propria importazione del modulo che si occupa di generare il nostro codice a barre. La funzione da utilizzare è Extended39. Essa riceve un parametro e restituisce il riferimento all’oggetto barcode. Il parametro da passare alla funzione è la stringa da trasformare in codice a barre. Nel nostro esempio si è scelto di convertire la stringa ‘1234’. Si tenga presente che la funzione accetta altri parametri opzionali e due di essi sono stati inseriti nell’esempio. barWidth e barHeight servono, infatti, ad impostare, rispettivamente, larghezza ed altezza dell’immagine che verrà generata. Si noti come per tale situazione si sia usata la variabile mm, precedentemente (1) importata. Come già detto, essa converte automaticamente i millimetri indicati in punti. Subito dopo aver generato il nostro oggetto barcode possiamo “disegnarlo” all’interno del pdf con il suo metodo drawOn. Esso accetta tre parametri: un oggetto di tipo canvas (quello che stiamo usando per generare il nostro pdf), nel quale inserire l’immagine, la posizione sull’asse orizzontale e quella sull’asse verticale nel nostro documento della stessa.
Come si può notare anche la generazione dei codici a barre è molto elastica e potente con questo strumento e nella documentazione ufficiale si possono trovare altri riferimenti ad altre funzioni certamente utili.