Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-17 Thread Manlio Perillo
2014-03-16 19:40 GMT+01:00 Roberto De Ioris :

> [...]
> > Le alternative che *io* vedo sono tutte architetturali, ovvero mettersi
> > nell'ordine di idee di avere un pool di worker fuori dall'app web e
> > delegare quasi ogni cosa li.
>
>
> Che sono le stesse che propongo io, django riceve la richiesta, fa tutti i
> controlli del caso (come l'autenticazione) e poi passa la connessione (o
> tramite proxy o tramite fd-passing su socket unix) al backend gevent che
> continua a gestire la sessione liberando django.
>
> Forse mi sono perso qualcosa, ma quale è la differenza tra questa
soluzione ed avere Apache prefork con N + M processi?

La soluzione che hai indicato è quella tipica frontend + backend, nel caso
in cui il frontend sa gestire 10K ma il backend no (e spesso non deve
farlo).

Ma davvero ci sono vantaggi in un ulteriore livello, in cui l'applicazione
Django minimale fa da frontend e tutto il resto (inclusa connessione al
database) la fa un ulteriore backend?


Ciao  Manlio
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


[Python] [OT] Nuovo sito python.org

2014-03-17 Thread Massimo Capanni
Noto con piacere che hanno rifatto il trucco al sito web python.org
Che ne pensate?

:-)

ps. magari è così da mo' ...


.m

.Massimo .Capanni

σπευδε βραδεως
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] [OT] Nuovo sito python.org

2014-03-17 Thread Carlos Catucci
2014-03-17 11:15 GMT+01:00 Massimo Capanni :

> Noto con piacere che hanno rifatto il trucco al sito web python.org
>  Che ne pensate?
>

Muy lindo! Me gusta mucho màs!

Carlos
-- 
Coloro che sognano di giorno sono uomini pericolosi, perche' sono capaci di
recitare a occhi aperti il loro sogno fino a renderlo possibile. Ed e'
questo che feci anch'io. - (T.E. Lawrence)
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-17 Thread Roberto De Ioris

> 2014-03-16 19:40 GMT+01:00 Roberto De Ioris :
>
>> [...]
>> > Le alternative che *io* vedo sono tutte architetturali, ovvero
>> mettersi
>> > nell'ordine di idee di avere un pool di worker fuori dall'app web e
>> > delegare quasi ogni cosa li.
>>
>>
>> Che sono le stesse che propongo io, django riceve la richiesta, fa tutti
>> i
>> controlli del caso (come l'autenticazione) e poi passa la connessione (o
>> tramite proxy o tramite fd-passing su socket unix) al backend gevent che
>> continua a gestire la sessione liberando django.
>>
>> Forse mi sono perso qualcosa, ma quale è la differenza tra questa
> soluzione ed avere Apache prefork con N + M processi?
>
> La soluzione che hai indicato è quella tipica frontend + backend, nel caso
> in cui il frontend sa gestire 10K ma il backend no (e spesso non deve
> farlo).
>
> Ma davvero ci sono vantaggi in un ulteriore livello, in cui l'applicazione
> Django minimale fa da frontend e tutto il resto (inclusa connessione al
> database) la fa un ulteriore backend?
>

Ti faccio l'esempio di un progetto sui cui ho lavorato di recente che deve
fornire notifiche (tramite SSE) in tempo reale, scrivendo dei testi in un
div.

La parte SSE all'inizio deve essere comunque autenticata, deve prendere
dei dati dal db per scegliere che tipo di informazioni mi servono, dopo di
che django non serve piu', i dati che mi arrivano sono presi da redis.

Quindi una volta che django ha autenticato l'utente, e scelto cosa fargli
vedere, passa la connessione (la tecnica usata e' irrilevante) al livello
"back-backend" (chiamiamolo cosi') che si occupa di leggere in maniera non
bloccante da una coda redis e inviare le informazioni (e la cosa potrebbe
durare ore). A questo punto django ha finito il suo ciclo di richiesta ed
e' pronto a gestirne un' altra.

Il giro e'

proxy non bloccante -> application server bloccante -> application server
non bloccante.

Non parlerei di vantaggi, ma di necessita', far digerire a django il
modello gevent (o quello che sia) e' talmente tedioso come processo che
tanto vale aggiungere un ulteriore strato. E' un po' piu' macchinoso senza
dubbio, ma non ha (teoricamente) sorprese sul medio e lungo termine.

Io non metto in dubbio che avere tutto non bloccante da cima a fondo sia
l'approccio migliore, ma una azienda che ha investito in Django non passa
a tornado da un giorno all'altro (o a nodejs o a Go o a Rust ecc. ecc.),
quindi bisogna ricorrere a workaround che comunque mantengano un certo di
grado di solidita'. (e poi devo ancora trovarne di framework
non-blocking-friendly che siano al livello di django)

Poi se alcune aziende ci riescono, buon per loro, hanno il mio rispetto e
la mia somma invidia :)

-- 
Roberto De Ioris
http://unbit.it
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-17 Thread Manlio Perillo
2014-03-15 7:42 GMT+01:00 Nicola Larosa :

> Manlio Perillo wrote:
>
>> > [...]
>
>  Twisted offre un framework per la programmazione asincrona da anni,
>> ma non è mai stato di moda, perchè molto più difficile.
>>
>
> Non ha avuto grande successo per vari altri motivi: avanti sui suoi
> tempi, documentazione carente, e anche insistenza sulla sintassi a
> callback preferita alle inline callback.
>
>
Secondo me molto ha influito il fatto che non fosse compatibile con il
resto del mondo Python.

>
>
>  Considerato tutti i problemi che gli utenti hanno con tornado e
>> friends (e che nemmeno sanno di sapere), direi che, come sempre,
>> "explicit is better than implicit".
>>
>
> Poco ma sicuro. Creare punti impliciti di cambio di contesto, come fanno
> gevent ed eventlet, e come fanno i thread preemptive, è ingestibile.
>
>
Si, ma con gevent i punti di cambio di contesto sono "deterministici".
Non sono espliciti, ma se la libreria che usa le coroutine è scritta bene
sai dove può avvenire lo switch, anche se magari sommerso tra 5-10 funzioni
(cosa non bella, in effetti, ma è proprio uno dei "problemi" con yield che
ti devi portare dietro sempre)


>
>  Il mio suggerimento è sempre quello di imparare prima le basi (vicino
>> a quello che realmente succede) e solo dopo utilizzare cose che
>> rendono la programmazione e manutenzione più semplice.
>>
>
> Se con questo intendi passare per la sintassi a callback prima di usare
> la pseudo sincrona, non sono d'accordo.


No, indendevo capire quello che succede "sotto il cofano", altrimento non
ci si rende conto dei possibili problemi e/o come risolverli.


> Non si tratta di basi, è
> semplicemente un modo diverso, molto meno leggibile, di scrivere codice
> asincrono.
>
> Ormai le Promises ci sono anche in Javascript, non ha senso insistere col
> vecchio modello. Però andare troppo oltre e rinunciare agli yield, che
> marcano i punti di cambio di contesto, significa andarsela a cercare.
>
> Glyph Lefkowitz, cioè Mr. Twisted, fa un'ottima panoramica delle opzioni
> disponibili, ed illustra bene i pericoli di usare una sintassi implicita:
>
> "1. Straight callbacks: Twisted’s IProtocol, JavaScript’s on idiom,
> where you give a callback to something which will call it later and then
> return control to something (usually a main loop) which will execute
> those callbacks,
>
> 2. “Managed” callbacks, or Futures: Twisted’s Deferred, JavaScript’s
> Promises/A[+], E’s Promises, where you create a dedicated
> result-that-will-be-available-in-the-future object and return it for the
> caller to add callbacks to,
>
> 3. Explicit coroutines: Twisted’s @inlineCallbacks, Tulip’s yield from
> coroutines, C#’s async/await, where you have a syntactic feature that
> explicitly suspends the current routine,
>
> 4. and finally, implicit coroutines: Java’s “green threads”, Twisted’s
> Corotwine, eventlet, gevent, where any function may switch the entire
> stack of the current thread of control by calling a function which
> suspends it.
>
>
Go non ha una sintassi per sospendere esplicitamente una goroutine; quindi
appartiene a 4) ?

> [...]


Ciao   Manlio
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-17 Thread Nicola Larosa

Nicola Larosa wrote:

"3. Explicit coroutines: Twisted’s @inlineCallbacks, Tulip’s yield
from coroutines, C#’s async/await, where you have a syntactic
feature that explicitly suspends the current routine,

4. and finally, implicit coroutines: Java’s “green threads”,
Twisted’s Corotwine, eventlet, gevent, where any function may
switch the entire stack of the current thread of control by calling
a function which suspends it."


Manlio Perillo wrote:

Go non ha una sintassi per sospendere esplicitamente una goroutine;
quindi appartiene a 4)?


La sospensione avviene quando una goroutine manda un valore su un canale
non bufferizzato: fin quando un'altra goroutine non legge quel valore, la
prima è bloccata.

E poi ovviamente anche quando una goroutine riceve un valore da un canale
non bufferizzato, o vuoto.

Invio e ricezione fanno parte della sintassi del linguaggio, tramite gli 
operatori freccia "->" e "<-".


--
Nicola Larosa - http://www.tekNico.net/

A plus sign is just a square with collapsed sides,
after passing through a hash sign:
◽ # +
(Where are my medications when I need them?)
 - Nicola Larosa, February 2014
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] [OT] Nuovo sito python.org

2014-03-17 Thread Francesco Maida
Secondo me è un bel restyling che ci voleva.
Quella console in cui provare il codice Python direttamente dal browser mi
ricorda tanto il modo in cui era strutturato il sito di Ruby fino a qualche
mese fa. Adesso il sito di Ruby è cambiato, una volta aveva la paginetta di
TryRuby in bella vista mentre ora c'è un link da cliccare per arrivarci.



Il giorno 17 marzo 2014 11:15, Massimo Capanni
ha scritto:

> Noto con piacere che hanno rifatto il trucco al sito web python.org
> Che ne pensate?
>
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-17 Thread Manlio Perillo
On Mon, Mar 17, 2014 at 12:34 PM, Nicola Larosa  wrote:

> Nicola Larosa wrote:
>>
>>> "3. Explicit coroutines: Twisted’s @inlineCallbacks, Tulip’s yield
>>> from coroutines, C#’s async/await, where you have a syntactic
>>> feature that explicitly suspends the current routine,
>>>
>>> 4. and finally, implicit coroutines: Java’s “green threads”,
>>> Twisted’s Corotwine, eventlet, gevent, where any function may
>>> switch the entire stack of the current thread of control by calling
>>> a function which suspends it."
>>>
>>
> Manlio Perillo wrote:
>
>> Go non ha una sintassi per sospendere esplicitamente una goroutine;
>> quindi appartiene a 4)?
>>
>
> La sospensione avviene quando una goroutine manda un valore su un canale
> non bufferizzato: fin quando un'altra goroutine non legge quel valore, la
> prima è bloccata.
>
> E poi ovviamente anche quando una goroutine riceve un valore da un canale
> non bufferizzato, o vuoto.
>
> Invio e ricezione fanno parte della sintassi del linguaggio, tramite gli
> operatori freccia "->" e "<-".
>
>
>
Si, ma una scrittuta/lettura su un canale possono essere "nidificate"
all'interno di N funzioni.  Non è' lo stesso di quello che accade con
gevent?

Con yield è diverso, perchè deve essere presente in ogni livello di
chiamata a funzione.


Ciao  Manlio
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


[Python] Pyqt QtableWidget itemPressed(int,int)

2014-03-17 Thread Giuseppe Amato
Salve a tutti,
Sono da poco passato a PyQt e ho un problema con i signal. Ho una
QMainWindow che richiama un QDialog su cui è presente un QtableWidget. Il
tableWidget ha un signal, vedi sotto, che stampa riga e colonna dell'item
cliccato.

Siccome il QDialog e il QMainWindow sono in due file separati, aggiungendo
il codice sotto al file del QDialog non ho problemi e funziona tutto a
dovere.

File: TFT_Output_GUI.py
(...)
QtCore.QObject.connect(self.tableWidget,
QtCore.SIGNAL(_fromUtf8("cellPressed(int,int)")),
self.test)
QtCore.QMetaObject.connectSlotsByName(Dialog)

def test(self,row,column):
print row,column
(...)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())

Quando invece lo vado a richiamare dal QMainWindow non viene mai triggerato
l'evento cellPressed e non entra nella funzione test.
A seguire il codice differente:

File: MyApp.py

class ResultDialog():
def __init__(self,parent=None):
self.Dialog = QtGui.QDialog(parent.MainWindow)
self.ui = TFT_Output_Gui.Ui_Dialog()
self.ui.setupUi(self.Dialog)

QtCore.QObject.connect(self.ui.tableWidget,
QtCore.SIGNAL(TFT_Output_Gui._fromUtf8("cellPressed(int,int)")),
self.test)
QtCore.QMetaObject.connectSlotsByName(self.Dialog)
self.Dialog.show()

def test(self,row,column):
print row,column

Qualche idea del perchè succeda?

-- 

Giuseppe Amato
e-mail: giuam...@gmail.com
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-17 Thread Manlio Perillo
2014-03-17 11:22 GMT+01:00 Roberto De Ioris :

> > [...]
> >> Forse mi sono perso qualcosa, ma quale è la differenza tra questa
> > soluzione ed avere Apache prefork con N + M processi?
> >
> > La soluzione che hai indicato è quella tipica frontend + backend, nel
> caso
> > in cui il frontend sa gestire 10K ma il backend no (e spesso non deve
> > farlo).
> >
> > Ma davvero ci sono vantaggi in un ulteriore livello, in cui
> l'applicazione
> > Django minimale fa da frontend e tutto il resto (inclusa connessione al
> > database) la fa un ulteriore backend?
> >
>
> Ti faccio l'esempio di un progetto sui cui ho lavorato di recente che deve
> fornire notifiche (tramite SSE) in tempo reale, scrivendo dei testi in un
> div.
>
> La parte SSE all'inizio deve essere comunque autenticata, deve prendere
> dei dati dal db per scegliere che tipo di informazioni mi servono, dopo di
> che django non serve piu', i dati che mi arrivano sono presi da redis.
>
> Quindi una volta che django ha autenticato l'utente, e scelto cosa fargli
> vedere, passa la connessione (la tecnica usata e' irrilevante)


Irrilevante, ma altamente dipendente dal sistema operativo e non tutti la
supportano :)


> al livello
> "back-backend" (chiamiamolo cosi') che si occupa di leggere in maniera non
> bloccante da una coda redis e inviare le informazioni (e la cosa potrebbe
> durare ore). A questo punto django ha finito il suo ciclo di richiesta ed
> e' pronto a gestirne un' altra.
>
>
In effetti questo è un caso particolare che non avevo considerato.


> Il giro e'
>
> proxy non bloccante -> application server bloccante -> application server
> non bloccante.
>
> Non parlerei di vantaggi, ma di necessita', far digerire a django il
> modello gevent (o quello che sia) e' talmente tedioso come processo che
> tanto vale aggiungere un ulteriore strato. E' un po' piu' macchinoso senza
> dubbio, ma non ha (teoricamente) sorprese sul medio e lungo termine.
>
>
Questo non è un caso d'uso dei web sockets?
Il problema è l'autenticazione; con la soluzione attuale il back-back-end
riceve dati da una fonte sicura.
Però con i websockets potresti disaccoppiare completamente i due backend
(?).


> Io non metto in dubbio che avere tutto non bloccante da cima a fondo sia
> l'approccio migliore, ma una azienda che ha investito in Django non passa
> a tornado da un giorno all'altro (o a nodejs o a Go o a Rust ecc. ecc.),
> quindi bisogna ricorrere a workaround che comunque mantengano un certo di
> grado di solidita'. (e poi devo ancora trovarne di framework
> non-blocking-friendly che siano al livello di django)
>
>
Vero, ma bisogna stare attenti a non cadere nella sindrome dell'utilizzo a
tutti costi perchè è l'unica cosa che conosco/conoscono gli altri.


Ciao  Manlio
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Non blocking http server e integrazione con database relazionali

2014-03-17 Thread Nicola Larosa

Manlio Perillo wrote:

Si, ma una scrittura/lettura su un canale possono essere "nidificate"
all'interno di N funzioni. Non è lo stesso di quello che accade con
gevent?

Con yield è diverso, perchè deve essere presente in ogni livello di
chiamata a funzione.


Non l'avevo vista in questi termini, ma credo tu abbia ragione.

--
Nicola Larosa - http://www.tekNico.net/

I still get as annoyed as ever by "use the right tool for the job" -
the bland truism meant to shut down critical discussion and engagement
with the tasks and choices in software engineering, replacing it with
a weak passionless technical fatalism. - Ian Bicking, February 2014
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Escape stringa con char speciali

2014-03-17 Thread Fabrizio Soppelsa
On 03/15/2014 11:45 AM, Enrico Bianchi wrote:
> On 03/12/2014 04:23 PM, Fabrizio Soppelsa wrote:
>> Ogni suggerimento ben accetto:)
>
> Perche` non ti connetti direttamente al database con il driver apposito?

Perche' devo lavorare su una macchina che boota da PXE e non posso
installare niente in piu' del sistema base.

FS.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


[Python] alternative ad eval

2014-03-17 Thread Balan Victor
Ho un array di tuple cosi formate da 3 elementi:
(int|float|boolean|string|datetime|..., string, boolean). Es:

[
 (10, "value >= 1", True),
 ("Ciao", "o in value", True),
 (True, "value == False", False),
 (92.5f, "value >= 92.0f", True),
]
Il primo elemento della tupla può essere qualunque tipo o classe di python.
Il secondo elemento è una espressione da applicare sulla tupla e che deve
restituire True or False(value si riferisce al primo elemento della tupa)
Il terzo elemento è il risultato dell'operazione appena sopra.

A intervalli regolari ho bisogno di scorrere l'array sopra e aggiornare il
valore del terzo elemento.
Ho pensato di usare eval in questo modo:

def check_status(value, eval_string):
  rc =  eval(eval_string)
  if rc is not bool: raise WrongEvalString()
  return rc

Conosco i rischi di eval e vorrei evitare di usarlo però non riesco a
trovare nulla di altrettanto semplice e con le stesse potenzialità.

NB: In realtà la stringa che fa la validazione può essere impostata solo da
qualcuno di autorizzato quindi il rischio che mi cancelli tutto il fs non
ci dovrebbe essere, e non dovrebbero nemmeno fare operazioni del tipo
"value ** value" però in ogni caso vorrei trovare qualcosa che mi metta al
sicuro da questo tipo di operazioni.

grazie
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] alternative ad eval

2014-03-17 Thread enrico franchi
2014-03-17 21:57 GMT+00:00 Balan Victor :

> Conosco i rischi di eval e vorrei evitare di usarlo però non riesco a
> trovare nulla di altrettanto semplice e con le stesse potenzialità.
>

La soluzione 'semplice' e' scrivere un piccolo parser per le espressioni
che ti servono.
E' meno complicato di quello che sembra, e' molto robusto perche' hai il
completo controllo e non hai rischi.

Altrimenti Python viene con un po' di librerie per parsare python. Il
problema e' che una completa sandbox e' (l'ultima volta che mi ero
informato) essenzialmente impossibile per come funziona Python. Quindi hai
comunque rischi.


-- 
.
..: -enrico-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] alternative ad eval

2014-03-17 Thread Balan Victor
Il giorno 17 marzo 2014 23:29, enrico franchi  ha
scritto:

>
> 2014-03-17 21:57 GMT+00:00 Balan Victor :
>
> Conosco i rischi di eval e vorrei evitare di usarlo però non riesco a
>> trovare nulla di altrettanto semplice e con le stesse potenzialità.
>>
>
> La soluzione 'semplice' e' scrivere un piccolo parser per le espressioni
> che ti servono.
> E' meno complicato di quello che sembra, e' molto robusto perche' hai il
> completo controllo e non hai rischi.
>
> Ci avevo pensato però non ho trovato granché che mi aiutasse a fare
qualche prova. Inoltre visto che l'utente, se ha bisogno, può definire
oggetti di vario tipo per essere usati come value può anche definire una
funzione check per l'oggetto e dentro la stringa da passare ad eval può
scrivere "value.check()". Questo come lo gestisco nel parser? E come li
passo value ? Questo è un caso estremo, però può accedere. I

n ogni caso mi accontento di farlo funzionare solo con int, float, bool,
string e datetime però non so da dove cominciare.



> Altrimenti Python viene con un po' di librerie per parsare python. Il
> problema e' che una completa sandbox e' (l'ultima volta che mi ero
> informato) essenzialmente impossibile per come funziona Python. Quindi hai
> comunque rischi.
>
tipo pyparser? L'ho guardato ma la documentazione non mi sembra molto
chiara e sembra che sia stato abbandonato ...
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] alternative ad eval

2014-03-17 Thread enrico franchi
2014-03-17 23:14 GMT+00:00 Balan Victor :

>
> Il giorno 17 marzo 2014 23:29, enrico franchi ha 
> scritto:
>
>
>> 2014-03-17 21:57 GMT+00:00 Balan Victor :
>>
>> Conosco i rischi di eval e vorrei evitare di usarlo però non riesco a
>>> trovare nulla di altrettanto semplice e con le stesse potenzialità.
>>>
>>
>> La soluzione 'semplice' e' scrivere un piccolo parser per le espressioni
>> che ti servono.
>> E' meno complicato di quello che sembra, e' molto robusto perche' hai il
>> completo controllo e non hai rischi.
>>
>> Ci avevo pensato però non ho trovato granché che mi aiutasse a fare
> qualche prova. Inoltre visto che l'utente, se ha bisogno, può definire
> oggetti di vario tipo per essere usati come value può anche definire una
> funzione check per l'oggetto e dentro la stringa da passare ad eval può
> scrivere "value.check()". Questo come lo gestisco nel parser? E come li
> passo value ? Questo è un caso estremo, però può accedere. I
>
> In ogni caso mi accontento di farlo funzionare solo con int, float, bool,
> string e datetime però non so da dove cominciare.
>


Ehm.. con la grammatica del linguaggio che vuoi parsare.

Ma lascia che te lo dica... secondo me rischi di ficcarti in un mezzo
ginepraio. Il fatto che tu abbia bisogno di questo secondo campo cosi'
flessibile non ottimo indice che le cose saranno facili.

Per il resto puoi definirti un linguaggio che fa tutto quello che ti pare,
ma non sarebbe meglio limitarsi ad un set di check prefabbricati?


>
>
>
>> Altrimenti Python viene con un po' di librerie per parsare python. Il
>> problema e' che una completa sandbox e' (l'ultima volta che mi ero
>> informato) essenzialmente impossibile per come funziona Python. Quindi hai
>> comunque rischi.
>>
> tipo pyparser? L'ho guardato ma la documentazione non mi sembra molto
> chiara e sembra che sia stato abbandonato ...
>

No, quello ti serve per scrivere un parser. Uno dei tanti tool per farlo.

-- 
.
..: -enrico-
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python