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?

1 commenti:

Anonimo ha detto...

guarda il seguente articolo...
http://code.activestate.com/recipes/425345/

ciao Loris(aka) orcim