[PIPython] Database

Valentino Volonghi aka Dialtone dialtone
Gio 10 Mar 2005 20:51:14 CET


Andrea Giammarchi wrote:

> hai ragione in tutto e per tutto, tranne sul fatto che non conosco php 
> :-)
> Intendevo dire che se in SQLite 2 crei un campo date o integer e poi 
> ci schiaffi un longtext non succede niente, lo prende lo salva e 
> basta, come non succede niente in php se crei una var
> $pippo = 1;
>
> e poi
>
> $pippo = 'trallero trallalla';
>
>
> come mi sembra non accadi niente se in python scrivi
>
> pippo = 1
>
> e poi ...
>
> pippo = "trallallero trallalla"
>
>
> intendevo dire questo, e pensavo che lui intendesse questo, non che 
> non sono tipizzati, mi sono espresso male.

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 :).

-- 
Valentino Volonghi aka Dialtone
Now Running MacOSX 10.3.8
Blog: http://vvolonghi.blogspot.com
http://weever.berlios.de



More information about the Python mailing list