[Python] Mother
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 Ciao a tutti, mi sono iscritto da una settimana circa in ML con l'intento di promuovere un modulo python che sto scrivendo, con la speranza di trovare qualche interessato con cui condividere l'avventura. Mi e' gia' capitato di parlarne con Eriol. Il modulo si chiama Mother ed e' un ORM, cioe' un'astrazione per il linguaggio SQL, come SQLAlchemy o SQLobject. Utilizza l'ottimo psycopg. Il punto e' che ha delle caratteristiche peculiari e, spero, interessanti: * E' non tipato. Non occorre specificare il tipo dei campi delle tabelle. * E' non dichiarato: Mother e' introspettivo e conosce automaticamente i campi di ogni tabella. Questa grazie a un'inizializzazione, automatica, che viene eseguita una tantum. * Ogni classe puo' ottenere, senza necessita' di definizioni, i metodi per gestire automaticamente Figli, Relazioni e Join. * Connessione al DB persistente. * Un ottimo logger (speaker.py), che permette di loggare tramite syslog o su stdout. Per il momento solo postgres e' supportato, ma l'esclusiva mi attrae quasi :) Mi chiedo se non ci sia interesse da parte della comunita' italiana Python ad adottare il progetto, trasformandlo magari in una fucina attraverso la quale si possa prima di tutto divertirsi e imparare, ma anche portare avanti un progetto che potrebbe diventare piu' importante. Per questo sono a vostra disposizione. Al momento il codice e' accessibile tramite svn, (c'e' anche un Howto): $ svn co svn://siddharta.efphe.net/mother mother Spero di non avervi annoiato troppo. In seguito riporto qualche esempio (in verita' si tratta solo di qualche comando minimale) di utlizzo, per chiarire meglio le caratteristiche che ho cercato di descrivervi. Ciao e buon lavoro - -- efphe # ## Esempi, ricorda che i tipi non contano...uso uno pseudo SQL # CREATE TABLE ABC (a,b,c); CREATE TABLE DEF (d,e,f); CREATE TABLE AD (a,d, a foreign key (ABC.a),d foreign key(DEF.d)) >>> MyAbc=ClsAbc(dict(a=1,b='ciao mondo',c=27)) >>> MyAbc.insert() >>> MyDef=ClsDef(dict(d=2,e=78,f=42)) >>> MyDef.insert() >>> # Ora chiamo un metodo mai definito, ma automaticamente >>> # creato: crea un record in AD, mettendo in relazione >>> # Abc con Def >>> MyAbc.assignDef(MyDef) >>> # Ora voglio ottenere tutti i record relazionati: >>> # il metodo "joinDef()" e' gratuito e non occorre >>> # definirlo >>> MyAbc=ClsAbc(dict(a=1)) >>> MyDef_list= MyAbc.joinDef() >>> # oppure >>> MyDef_list= MyAbc.joinDef(filter="WHERE e=78") >>> # oppure >>> MyDef_list= MyAbc.joinDef(filter={e:78}) -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.5 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFFU6EQi7obm7aBjHcRAmRTAJ0Q+x1UDFfBcZ3BT8GHnOwFWYm7TwCfQTuZ wunl26ayJloYroCiLKFmLEY= =25jM -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Mother
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 Giovanni Porcari wrote: > Ciao > > stiamo facendo anche noi un progetto analogo. > Potrebbe essere interessante collaborare. Se lo desideri fatti sentire. Di che progetto si tratta? Un altro orm? - -- efphe -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.5 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFFU7UOi7obm7aBjHcRAsnBAJ9PJ3HDXZNTvDYVKHYVqVIf3iCXqACfdQo1 ArAyzv2/Hbu1tL+laqUE8h4= =0pls -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] exporting di classi
Manlio Perillo wrote: Federico Tomassini ha scritto: Ciao a tutti, ho un dubbio sui python internal. Ecco la situazione; ho due classi: ### class Foo: def __init__(self): self.x= 0 def inc(self): self.x+= 1 class Bar: def __init__(self): self.x= 0 foo=Foo() bar=Bar() ### Poi, eseguo cio' che chiamo un'exporting di classe: ### attr= getattr(foo, 'inc') setattr(bar, 'inc', attr) ### In questo modo la classe `bar` avra' il metodo 'inc', richiamabile tramite `self.inc`. Se a questo punto qualcuno si chiedesse perche' non eredito, la risposta e' la seguente: l'ereditarieta' costringe, per ogni classe, a inizializzare un nuovo padre; queso in genere non e' un problema, ma nel mio caso voglio che le mie classi utilizzino tutte lo *stesso padre*, e non un' istanza ciascuna. In Python la classe base non è inizializzata a meno che non lo richieda tu esplicitamente. Mi sembrava che la frase: """ ma nel mio caso voglio che le mie classi utilizzino tutte lo *stesso padre* """ fosse chiara. Il problema non sta nell'inizializzazione, e non si aggira non inizializzando nulla. Mi spiego in altre parole: ho bisogno di *un*'istanza Foo che venga utilizzata da *ogni* istanza Bar, in modo che l'istanza Foo sia condivisa, persistente e shared per ogni classe Bar. Al tempo stesso, mi chiedo se sia possibile (di certo lo e', basta fare abbastanza hack) e come possa essere implementato un meccanismo di "esportazione di tipo ereditaria": il metodo inc, in altre parole, dovrebbe inizializzare il primo argomento (self) a Bar.bar e non a Foo.foo. Ma attenzione, se ho due istanza Bar, B e C, devo avere: memory_address(B.inc)= memory_address(C.inc) -- efphe ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] exporting di classi
Manlio Perillo wrote: Al tempo stesso, mi chiedo se sia possibile (di certo lo e', basta fare abbastanza hack) e come possa essere implementato un meccanismo di "esportazione di tipo ereditaria": il metodo inc, in altre parole, dovrebbe inizializzare il primo argomento (self) a Bar.bar e non a Foo.foo. Ma attenzione, se ho due istanza Bar, B e C, devo avere: memory_address(B.inc)= memory_address(C.inc) Se è proprio questo quello che vuoi, puoi fare: import types bar.inc = types.MethodType(foo.inc.im_func, bar) Yep, grazie, proprio quello che intendevo ;) -- efphe ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] script per file di log ( linee guida)
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 Salvatore MONACO wrote: > il file test.txt contiene > > Data Corrente 18/01/2007 Se non ho capito male devi vedere se quella e' la data di oggi? In caso: >>> fil= open(tuo_file) >>> s= fil.read() >>> dstr= s.split(' ')[-1] >>> import datetime >>> o= datetime.datetime.today() >>> ostr= oggi.strftime('%d/%m/%Y') >>> if ostr== dstr: >>> print 'Ok' Ma secondo me stai sbagliando. Visto che viene prodotto un file di log ogni giorno, la data specificata sul file coincide con la data d creazione del file. Quindi, puoi fare: >>> from stat import CTIME >>> import os >>> try: >>> stats= os.stat(tuo_file) >>> except: >>> print 'unexistent file' >>> today= datetime.datetime.today() >>> file_time= stats[CTIME] >>> ctime= datetime.datetime.fromtimestamp(ctime) >>> are_equal= (today- ctime).days and False or True Spero sia utile - -- efphe Today is Pungenday, the 18th day of Chaos in the YOLD 3173 -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.5 (GNU/Linux) iD8DBQFFr9Dgi7obm7aBjHcRAq+SAJ9tue+Pldz6n9fwAYK7XcK87XtV4ACffos/ sU0Som4TZqYIkWTOiz77Mr0= =AMFi -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] script per file di log ( linee guida)
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 ERRATA CORRIGE >>>> from stat import ST_CTIME >>>> import os >>>> try: >>>> stats= os.stat(tuo_file) >>>> except: >>>> print 'unexistent file' >>>> today= datetime.datetime.today() >>>> file_time= stats[ST_CTIME] >>>> ctime= datetime.datetime.fromtimestamp(ctime) >>>> are_equal= (today- ctime).days and False or True - -- efphe Today is Pungenday, the 18th day of Chaos in the YOLD 3173 -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.5 (GNU/Linux) iD8DBQFFr9JLi7obm7aBjHcRAnRLAJ4mr6xgpY+Zj/rOX9to4CyEVIYV7gCfZSP4 QlPcUQUK4SshF4gD565WG18= =JXdl -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Richiesta di consiglio...
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 Roberto Bettazzoni wrote: > Marco ha scritto: >> Salve >> io vorrei far lanciare a un programma python un programma esterno, >> se uso il comando >> status = os.system(cmd) >> python si ferma e resta in attesa del programma esterno. >> A me servirebbe invece che il programma esterno fosse indipendente ma >> recuperare il numero del processo per poterlo killare successimante. >> ma perche' invece di dichiarare del codice come stringa, poi salvarlo su file ed eseguire quest'ultimo, non usi semplicemente fork? Tra le altre cose, il codice: >>> while 1: >>> sleep(0.1) e' devastante. Usa pause, o poll, o select. I principi della programmazione Unix non vanno piu' di moda? :) - -- efphe Today is Setting Orange, the 20th day of Chaos in the YOLD 3173 -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.5 (GNU/Linux) iD8DBQFFsfxSi7obm7aBjHcRAo5IAJ9iRLzJjfrRJhtzA7j5QO2d1jeqQACfaqbr OND/EmxgoYI8gvRoiX52MyU= =l/qT -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Parere su DejaVu
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 Joril wrote: > Ciao a tutti! > Sono nella fase di dover scegliere un ORM per Python, e mi sarei orientato > verso DejaVu per via del suo approccio.. Qualcuno ha esperienze in merito? La > cosa che mi preoccupa di piu' e' che in una settimana non sono riuscito ad > avere segni di vita ne' dalla ML ne' dall'owner.. X-) > Grazie dell'attenzione! Se usi postgres, potrebbe essere interessante anche questo progetto che, insieme ad altri ragazzi, abbiamo sviluppato e continuiamo a mantenere: http://www.dbmother.org Spero possa essere utile. Ciao - -- efphe Today is Prickle-Prickle, the 11st day of Discord in the YOLD 3173 -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.5 (GNU/Linux) iD8DBQFGBoJ+i7obm7aBjHcRAsp/AJ9Y3uKt5bmxmoeSChOOKLzL7QHzvgCeIDgm JOe0dEau5iHToYGBwCdlGQU= =YYG0 -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Re: Parere su DejaVu
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 Joril wrote: > Ah, l'avevo visto sulla ML di Freshmeat, pero' non vorrei legarmi ad un DBMS > particolare.. Grazie della segnalazione cmq :) Eh, all'inizio pensavo anch'io fosse un limite grave. Nel TODO si era introdotta l'espansione ad altri db. Poi, pero', ci siamo resi conto di due cose: 1- la specializzazione su postgres permette features irrinunciabili, rendendo mother unica nel suo genere (ed era proprio il nostro obiettivo, altrimenti perche' sviluppare un altro orm?) 2- Oltre a postgres e (forse) Oracle, esistono forse altri db? ;) In ogni caso, credo che dovresti prendere la decisione considerando anche l'ambiente in cui ti muovi: in alcuni framework, per esempio, sqlalchemy e' gia' integrato. In questo caso credo sia opportuno. Per quanto riguarda Mother, il successo piu' grande finora pervenuto e' un prodotto Zope: si tratta di un gestionale con 75 tables. Quali sono le tue esigenze da questo punto di vista? Cosa ti attingi a sviluppare? - -- efphe Today is Prickle-Prickle, the 11st day of Discord in the YOLD 3173 -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.5 (GNU/Linux) iD8DBQFGBptZi7obm7aBjHcRAj3XAKCIB1Ay3/jZB2W3Fl8qiM6ycI2dKgCfSzNk OFmKvKn973igYP1TLoByTIw= =l7Ni -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Pattern singleton e chiamata __call__
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 Sbaush wrote: > Ciao a tutti. Sto sviluppando una applicazione Python e mi sono trovato a > dover implementare il pattern Singleton, seguendo quanto descritto in [1]. > Ho trovato diverse soluzioni su internet già scritte quindi il mio lavoro si > è trasformato nel dover scegliere quella che sembrava adattarsi meglio alla > vera natura del problema ed alla più corretta implementazione della > soluzione. Il mio piu' caldo, personale consiglio e' quello di evitare *assolutamente* questo design pattern in python. Produce del maligno (problemi con ereditarieta' ed ereditarieta' multipla e codice illeggibile, almeno). Non abbiamo bisogno del singleton, ne del borg. Li abbiamo gia'. Usa le classi (senza istanziarle) e gli staticmethods. Esempio: ### BEGIN ### class A: bar= 1 @staticmethod def foo(): print 'foo' @staticmethod def set_bar(value): A.bar= value @staticmethod def get_bar(): return A.bar class B(A): pass A.get_bar() A.set_bar(11) b= B() c= B() b.get_bar() c.get_bar() b.set_bar(10) c.get_bar() ### END ### Non istanziare A, usala direttamente. Puoi invece instanziare tranquillamente delle sottoclassi di A. In conclusione, il mio consiglio (da adattare piu' o meno alle tue esigenze) e': 1- dichiara una classe e dotala di tutti gli statimethods di cui necessiti. 2- quando una classe dovra' incarnare il tuo singleton, basta ereditare. - -- efphe Today is Boomtime, the 14th day of Discord in the YOLD 3173 -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.5 (GNU/Linux) iD8DBQFGCv9Vi7obm7aBjHcRAjbNAJ4srvslbZw7qTXf5fPRWqQM0/sdOACcC1Py QHRjh6apBi6TfEyJDqkW5F4= =1PGi -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Pattern singleton e chiamata __call__
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 Lawrence Oluyede wrote: >> Non abbiamo bisogno del singleton, ne del borg. Li abbiamo gia'. > > Non che mi sia mai servito ma perché dovremmo evitare Borg? La domanda dovrebbe essere esattamente invertita: perche' dovremmo usarlo, invece di preferire le classi e gli static methods? - -- efphe Today is Boomtime, the 14th day of Discord in the YOLD 3173 -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.5 (GNU/Linux) iD4DBQFGCwQGi7obm7aBjHcRAhwGAJj/t32oecJOOMwntlYIqloHEioIAJsEkzKc CHMU3X+ALVlQDm2+zx3eZg== =y0RP -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Il modo migliore per generare file Microsoft Word
Luca wrote: Salve a tutti. Dovrei generare file in formato Microsoft Word dal contenuto piuttosto semplice ma in modo dinamico da una procedura python. Sapete consigliarmi cosa guardare e utilizzare? La piattaforma di sviluppo è win32 ma avere un metodo che sia multipiattaforma e portabile su Linux non guasterebbe per niente... Anche a me e' capitata la stessa esigenza. Ho scritto un template RTF, con dei nomi tipo: CODICE_FISCALE. Poi apro il file in lettura, lo leggo, sostituisco CODICE_FISCALE con il mio valore, e salvo il nuovo documento ottenuto. E' rozzo, ma funziona. efphe ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python