[Python] Problema con la condivisione e l'utilizzo di un dict globale
Marco Giusti
marco.giusti a gmail.com
Sab 13 Nov 2010 12:19:29 CET
On Sat, Nov 13, 2010 at 11:45:37AM +0100, lex mlist wrote:
> Giorno,
>
> torno alla carica con un'altro problema (e chiedo scusa se vi stresso).
no problem
[...]
> in test_1 invece semplicemente all' if __name__ == "__main__": chiamo prima
> la classe Application specificando il nome del file di configurazione, e poi
> provo a chiamare la funzione Error ma risulta sempre falsa.
> Provando a stampare con un print il dizionario (come si vede nella classe
> Application) il dizionario fornisce tali coppie ti chiave valore.
> A me sembra che il file errors.py utilizzi il dizionario prima della
> modifica della classe Application.
>
> Cosa sbaglio esattamente?
riporto qui il codice per semplicità
import yaml
from sys import exit
configuration = dict()
class Application(object):
def __init__(self, filename):
self.filename = filename
def setup(self):
try:
global configuration # <<< here the trick
configuration = yaml.load(open(self.filename))
except IOError:
exit('configuration file not found: %s' % self.filename)
print(configuration)
``configuration`` fa parte dello scope globale, quando dentro la
funzione setup tu fai l'assegnamento
configuration = yaml.load(open(self.filename))
tu leghi (bind) il nome configuration allo scope locale. quando da
dentro la funzione cerchi il nome ``configuration``, lui lo trova nello
scope locale e ritorna quello, ovvero i parametri di configurazione, ma
dal modulo ``error`` tu ottieni la variabile che è associata allo scope
globale.
un piccolo extra che puoi ignorare se credi. python mette a disposizione
una variabile globale, ``__debug__``, che è sempre vera a meno di
eseguire l'interprete python con le opzioni di ottimizzazione, -O. in
quel caso crea dei file con bytecode ottimizzato .pyo, invece dei
classici .pyc, inoltre è interessante come viene ottimizzato il codice:
import dis
def error(msg):
if __debug__:
print msg
error('exception...')
dis.dis(error)
prova a lanciare questo codice prima normalmente e poi con l'opzione -O.
m.
--
Cosa volete? Questo diavolo d'uomo ha sempre le tasche ripiene di argomenti
irresistibili.
-- Pierre Augustin Caron de Beaumarchais
Maggiori informazioni sulla lista
Python