[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