domenica 16 novembre 2008

Python è produttivo?

Introduzione In giro per la rete si dice che "Python è più produttivo di Java". Uno degli articoli che ne parla è http://www.ferg.org/projects/python_java_side-by-side.html. La tesi di base dell'articolo può essere riassunta con la seguente frase: "Dato che i programmi in Python sono più corti dei programmi in Java allora si fa prima a scrivere un programma in Python".
Questa affermazione non mi ha mai convinto più di tanto ma sembra che sia entrata nella cultura popolare dei programmatori, almeno della parte che usa Python.
Io mi sto trovando male con Python, e non mi sento più produttivo, di seguito vi racconto una delle mie ultime esperienze con Python e che dovrebbe farvi capire quali sono le mie perplessità riguardo a questa teoria della maggiore produttività.
Sono conscio del fatto che potrei non essere produttivo perché non lo conosco abbastanza bene, oppure perché conosco troppo bene il Java. Il problema è: quanto studio prima di diventare "produttivi" in Python?
Personalizzare la classe OptionParser. La classe optparse.OptionParser della libreria standard di python aiuta ad implementare in maniera semplice un'interfaccia a linea di comando.
La documentazione su http://www.python.org/doc/2.5.2/lib/module-optparse.html spiega come utilizzare la classe nel caso più semplice.
from optparse import OptionParser

parser = OptionParser()
parser.add_option("-f", "--file", dest="filename",
                  help="write report to FILE", metavar="FILE")
parser.add_option("-q", "--quiet",
                  action="store_false", dest="verbose", default=True,
                  help="don't print status messages to stdout")

(options, args) = parser.parse_args()

OptionParser è configurabile. Per esempio è possibile specificare un oggetto formatter diverso da quello di default per avere maggiore controllo sul formato del messaggio di help.
La signature del costruttore di OptionFormatter è la seguente:
class OptionParser (OptionContainer):
    def __init__(self,
                 usage=None,
                 option_list=None,
                 option_class=Option,
                 version=None,
                 conflict_handler="error",
                 description=None,
                 formatter=None,
                 add_help_option=True,
                 prog=None,
                 epilog=None):

Per cui per utilizzare un oggetto formatter diverso da quello predefinito basterebbe fare:
from optparse import OptionParser

parser = OptionParser(formatter=MyFormatter())
parser.add_option("-f", "--file", dest="filename",
                  help="write report to FILE", metavar="FILE")
parser.add_option("-q", "--quiet",
                  action="store_false", dest="verbose", default=True,
                  help="don't print status messages to stdout")

(options, args) = parser.parse_args()
Ma rimane il problema: come costruisco la classe MyFormatter? Quali metodi deve implementare? La documentazione del costruttore di OptionParser non ci aiuta: non c'è! La signature del metodo non ci aiuta: in Python non è richiesto e non si usa specificare l'interfaccia che un oggetto in input deve implementare. Come faccio a disegnare la mia implementazione di Formatter se non esiste una specifica dell'interfaccia?
Perché dicono che il python è più produttivo? Dicono che Python è più produttivo "perché scrivi meno codice". E' questo il codice che si risparmia di scrivere? Lo scrittore di OptionParser ha risparmiato due secondi ha scrivere il nome dell'interfaccia nella signature del metodo, bene. Io quanto tempo devo perdere per capire quali sono i metodi che devo implementare per scrivere un Formatter? Per andarmi a rivedere il codice sorgente della classe OptionParser e le altre classi del modulo optparse?

martedì 11 novembre 2008