[PIPython] Database

Andrea Giammarchi andrea
Ven 11 Mar 2005 09:33:34 CET


Penso che a grandi linee accada lostesso in php, solo che tenta un 
"casting dinamico" prima di confrontare :-)
Comunque ci siamo capiti, spero, io parlavo della noncuranza di SQLite 2 
sul tipo di campo, che viene tralasciata e l' esempio era che come in 
php una variabile dichiarata numerica puo' essere poi sovrascritta e 
diventare booleana o di tipo stringa e che quindi prima di fare 
operazioni tipo $pippo += 3; e' sempre bene accertarsi che $pippo sia un int
$pippo = is_int( $pippo ) ? $pippo + 3 : (int)$pippo + 3;
idem per sqlite 2, se sappiamo che il campo da inserire o updatare e' un 
campo di tipo date o integer, e' sempre meglio prima accertarsi che il 
valore che stiamo inviando al db sia del tipo desiderato.
Questo invece non sarebbe consentito in MySQL, dove se ho un int 
unsigned ed inserisco una stringa il db mi dara' un errore ... insomma, 
intendevo questo :D

Mi interessa molto invece quel pypy di cui parli, forse troppo tecnico 
per il mio livello di python ma e' bello vedere quante diamine di 
varianti abbia questo linguaggio che adoro ma che purtroppo non ho molto 
tempo per approfondire ( sono iscritto a questa ml apposta ! ) .... 
sapresti consigliarmi qualche link utile per avere maggiori info ? 
grazie :-)

Invece per SQLite e la ML, basta andare qui:
http://www.sqlite.org/support.html

ciao,
andr3a


Valentino Volonghi aka Dialtone wrote:

> Non conosco php ma posso spiegarti perche` succede in python.
>
> Quando tu fai
>
> pippo = "trallallero trallalla"
>
> stai creando un oggetto stringa "trallallero trallalla" e stai dicendo 
> che il nome pippo puntera` a quell'oggetto.
> Se ad esempio scrivi:
>
> foo = pippo
>
> Stai dicendo che il puntatore di pippo va assegnato anche a foo. E 
> quindi foo e pippo punteranno allo stesso oggetto.
>
> Quando scrivi:
>
> pippo = 1
>
> Crea l'oggetto 1 e il suo puntatore assegnalo a pippo.
>
> Sara` cambiato foo? (abbiamo fatto foo = pippo)
>
> No, perche` del puntatore assegnato a foo non abbiamo toccato nulla. 
> Semplicemente abbiamo tolto una referenza dall'oggetto "trallallero 
> tallalla" perche` ora il nome pippo non puntera` piu` a lui ma 
> all'oggetto 1.
>
> Andiamo a vedere come si decompone la sequenza:
>
> a = "trallallero trallalla"
> b = a
> a = 1
>
> In bytecode python:
>
> In [1]: import dis
>
> In [2]: def fun():
>   ...:     a = "trallallero trallalla"
>   ...:     b = a
>   ...:     a = 1
>   ...:   
> In [3]: dis.dis(fun)
>  2           0 LOAD_CONST               1 ('trallallero trallalla')
>              3 STORE_FAST               0 (a)
>
>  3           6 LOAD_FAST                0 (a)
>              9 STORE_FAST               1 (b)
>
>  4          12 LOAD_CONST               2 (1)
>             15 STORE_FAST               0 (a)
>             18 LOAD_CONST               0 (None)
>             21 RETURN_VALUE      
>
> A questo punto, usando il comodissimo PyPy (l'implementazione 
> sperimentale di python in python stesso) ti posso mostrare questo 
> bytecode cosa fa:
>
>    def LOAD_CONST(f, constindex):
>        w_const = f.getconstant_w(constindex)
>        f.valuestack.push(w_const)
>    def STORE_FAST(f, varindex):
>        w_newvalue = f.valuestack.pop()
>        f.fastlocals_w[varindex] = w_newvalue
>    def LOAD_FAST(f, varindex):
>        # access a local variable directly
>        w_value = f.fastlocals_w[varindex]
>        if w_value is None:
>            varname = f.getlocalvarname(varindex)
>            message = "local variable '%s' referenced before 
> assignment" % varname
>            raise OperationError(f.space.w_UnboundLocalError, 
> f.space.wrap(message))
>        f.valuestack.push(w_value)
>
> dove f e` la classe 'Implementatore_di_bytecode'.
>
> Come vedi le operazioni che vengono fatte non si preoccupano del 
> valore prima contenuto in un nome (varindex) ma lo sovrascrivono senza 
> pensarci:
> f.fastlocals_w[varindex] = w_newvalue
>
> Ovviamente essendo il nome di variabile un semplice index in un 
> dizionario (ed e` davvero cosi` anche in CPython) e` assurdo 
> assegnargli un tipo. E` come dire che il tuo nome e` di tipo persona. 
> Ma se poi lo dai a un cane? a un gatto? Che succede? Nulla, e` legale, 
> un nome e` un nome.
>
> Purtroppo nelle scuole e nei corsi di formazione, si e` insegnato per 
> anni che una variabile era una scatola che poteva contenere solo 
> alcuni oggetti. La verita` e` ben diversa. La variabile e` una 
> etichetta con sopra scritto un nome, e come tutte le etichette la puoi 
> spostare dove vuoi e dove preferisci senza preoccuparti a cosa la 
> appiccichi, l'importante e` che si appiccichi.
>
> E ora, tutti ad aiutare lo sviluppo di PyPy :).
>



More information about the Python mailing list