[Python] Si possono creare variabili globali all'interno di una funzione che si trova a sua volta all'interno di un modulo?

Manlio Perillo manlio.perillo a gmail.com
Lun 13 Maggio 2013 18:08:34 CEST


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Il 13/05/2013 17:40, Germano Carella ha scritto:
> [...]
> def setglobals(name,value):
> 
> “””Name è la stringa contenente il nome della variabile; value è il suo
> valore…”””
> 
> If type(name) is str:
> 
>   Globals()[‘%s’%name]=value
> 

Sono curioso di sapere con che editor hai scritto questo codice...

> Else:
> 
>   Raise TypeError(“richiesta una stringa come primo argomento.”)
> 
>  
> 
> Ok, la funzione, come detto, si trova all’interno di un modulo.
> 
> [...]
> Poi mi viene in mente di scrivere:
> 
> utils.nome
> 
> ‘germano’
> 
> Ops, allora l’ha creata!
> 
> Naturalmente l’ha creata a livello di modulo.
> 

globals restituisce il dizionario contenenti le variabili definite in
quel modulo.  Grazie al cielo, direi.

> Purtroppo, se invece di importare il modulo scrivo
> 
> From utils import setglobals
> 
> Setglobals(“nome”,”germano”)
> 
> Non dà errore, ma non crea la variabile.
> 

Forse fai confusione.  Stai comunque importando setglobals dal modulo
utils, esattamente come prima.

> 
> Ora la domanda: come faccio a impostare questa variabile nel dizionario
> globale delle variabili globali?
> Si può fare o sto dicendo scemenze?
>

Non si può fare, ma ci sono alternative.

Ad esempio Python ha il dizionario speciale __builtins__, dove ci sono
tutti gli identificatori built-in di Python; **abusandone** puoi fare
qualcosa tipo:

def setglobals(name, value):
    """Name è la stringa contenente il nome della variabile; value è il
       suo valore...
    """

    if type(name) is str:
        __builtins__['%s' % name] = value
    else:
        raise TypeError("richiesta una stringa come primo argomento.")


Ma rischi di confondere lo sfortunato che dovrà manutenere il codice in
futuro.

La soluzione più semplice e pulita è utilizzare un modulo dove
memorizzare tutte le variabili a cui devono accedere gli altri moduli;
esattamente come facevi nel primo esempio.

> [...]


Ciao  Manlio
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAlGREAIACgkQscQJ24LbaUSlrACfatUKG/vl18uMoSi4N0xzd4z9
0LEAmwap+4VrAjwOHoHWwj5nzJtkZ5gE
=YF7O
-----END PGP SIGNATURE-----


Maggiori informazioni sulla lista Python