[Python] Problema con la condivisione e l'utilizzo di un dict globale

Marco Giusti marco.giusti a gmail.com
Sab 13 Nov 2010 14:44:38 CET


On Sat, Nov 13, 2010 at 01:36:16PM +0100, lex mlist wrote:
> Ma sai che non funziona?

aspetta a dirlo


> questa è la classe ora:
[...]

non ricordo come accedi a `configuration` dal modulo `error`.

	from app import configuration

questo non funziona se al momento dell'import la configurazione non è
già stata letta

	import app
	app.configuration

questo funziona anche se il modulo `error` viene importato prima che la
configurazione venga letta, ma fai attenzione perché se l'eccezione
viene lanciata prima che la configurazione sia letta, avrai ancora un
dizionario vuoto.

il problema sta' nel design dell'applicazione perché dipende dall'ordine
in cui i moduli vengono importati ed questa è una trappola in cui puoi
cadere con facilità in futuro anche se per il momento metti un cerotto.
pensa a questo esempio: 2 file a cui in futuro si aggiunge un terzo:

app.py

	conf = {}

	class Application:
		...

	if __name__ == '__main__':
		app = Application(filename)
		import error
		# do stuff..

dopo abbastanza tempo da dimenticare che l'ordine di importazione dei
moduli ha un significato aggiungi un altro file

utils.py

	import error

	def dostaff():
		try:
			...
		except ...:
			error.qualcosa()


app.py

	import utils

	conf = {}

	class Application:
		...

		utils.dostaff()

	if __name__ == '__main__':
		app = Application(filename)
		import error
		# do stuff..

ecco che la fragilità della cosa si mosta nella sua pienezza.

personalmente credo che sia meglio non far dipendere il modulo `error`
da niente e passare come argomento tutto quello di cui ha bisogno:

	def error(debug=False):
		if debug:
			...
		else:
			...

ma ancora meglio può essere l'uso del modulo `logging` della libreria
standard e usare `log.debug()` ovunque senza test di sorta e lasciare la
configurazione del logger e degli observer il compito di gestire la
cosa. questo per evitare il prolificare ovunque nel codice di variabili
di `debug` e limitarne l'uso solo dove sia ha un _vero_  e _provato_
problema di performance.

m.

-- 
Lo punite del fatto che la sua infanzia ha strisciato sul suolo senza
stelo e senza tutore; gli imputate come un misfatto l'isolamento in cui
lo avete lasciato; della sua sventura fate il suo delitto! Nessuno gli
ha insegnato a sapere ciò che faceva: quest'uomo ignora. La sua colpa
appartiene al suo destino, non a lui. Voi colpite un innocente.
		-- Victor Hugo


Maggiori informazioni sulla lista Python