Programmare con Python: Guida completa by Marco Buttu
autore:Marco Buttu
La lingua: ita
Format: azw3, mobi
editore: LSWR Srl
pubblicato: 2014-12-25T23:00:00+00:00
Import circolari
Quando due moduli si importano a vicenda, si dice che si ha un import circolare (circular import). Gli import circolari sono causa, talvolta, di problemi la cui risoluzione non è immediata. Consideriamo, ad esempio, i seguenti due moduli:
$ ls
main.py mymodule.py
Il modulo main stampa il suo nome, poi importa mymodule e infine assegna la stringa 'main.py' all’etichetta a:
$ cat main.py
print(__name__)
import mymodule
a = 'main.py'
Il modulo mymodule, invece, stampa il suo nome, assegna la stringa 'mymodule.py' all’etichetta a, importa il modulo principale del programma e infine stampa l’etichetta a di quest’ultimo:
$ cat mymodule.py
print(__name__)
a = 'mymodule.py'
import __main__
print(__main__.a)
Ecco cosa accade se eseguiamo mymodule.py da linea di comando:
$ python mymodule.py
__main__
mymodule.py
Viene stampato il nome del modulo, che è '__main__', visto che mymodule.py è stato eseguito da linea di comando. Poi viene eseguita l’istruzione import __main__, la quale, però, non importa __main__ poiché questo è già in esecuzione e quindi presente su sys.modules; l’unico effetto di import __main__ è quello di rendere disponibile l’etichetta __main__. Viene infine stampata __main__.a, ovvero la stringa 'mymodule.py' assegnata all’etichetta a due istruzioni sopra la print().
Ecco, invece, cosa accade se eseguiamo main.py da linea di comando:
$ python main.py
__main__
mymodule
Traceback (most recent call last):
...
AttributeError: 'module' object has no attribute 'a'
Viene stampato il nome del modulo, che anche questa volta è '__main__', visto che main.py è stato eseguito da linea di comando. Fatto ciò, però, prima che venga assegnata l’etichetta a viene importato mymodule, e questa istruzione comporta l’esecuzione del codice contenuto in mymodule.py, ovvero:
1. print(__name__): stampa il nome del modulo, ovvero mymodule;
2. a = 'mymodule.py': assegna la stringa 'mymodule.py' all’etichetta a nel namespace di mymodule;
3. import __main__: il modulo __main__ (associato al file eseguito da linea di comando, main.py) è già presente in sys.modules, quindi non viene importato, e questa istruzione ha il solo effetto di rendere disponibile l’etichetta __main__ nel modulo mymodule;
4. print(__main__.a): questa istruzione dovrebbe stampare __main__.a. Quando, però, Python prova a risolvere l’etichetta a nel namespace del modulo principale, non la trova. Infatti questa etichetta non è stata ancora definita, poiché il flusso di esecuzione in main.py è ancora fermo alla penultima istruzione, import mymodule.
Per evitare questo genere di problemi, possiamo adottare le pratiche elencate alla pagina Programming FAQ del sito ufficiale: http://docs.python.org/3/faq/programming.html, alla sezione intitolata What are the “best practices” for using import in a module?.
Concludiamo questa sezione con una osservazione in merito al modulo __main__. Quando un file mymodule.py viene eseguito da linea di comando, il suo contenuto viene caricato in memoria e associato a un modulo chiamato __main__. Quindi è quest'ultimo a essere presente in sys.modules e non mymodule. Se, pertanto, in mymodule.py avessimo importato main piuttosto che __main__, il problema non si sarebbe presentato:
$ cat mymodule.py
print(__name__)
a = 'mymodule.py'
import main
print(main.a)
$ python main.py
__main__
mymodule
main
main.py
Questo perché, quando il modulo main.py viene eseguito da linea di comando, il suo codice viene caricato in memoria e assegnato al modulo __main__, quindi è questo a essere presente in sys.modules e non main:
$ cat mymodule.py
print(__name__)
a = 'mymodule.py'
import sys
print("'__main__' in sys.modules?", '__main__' in sys.modules)
print("'main' in sys.modules?", 'main' in sys.modules)
import main
print("Dopo l'import: 'main' in sys.modules?", 'main' in sys.
scaricare
Programmare con Python: Guida completa by Marco Buttu.mobi
Questo sito non memorizza alcun file sul suo server. Abbiamo solo indice e link contenuto fornito da altri siti. Contatta i fornitori di contenuti per rimuovere eventuali contenuti di copyright e inviaci un'email. Cancelleremo immediatamente i collegamenti o il contenuto pertinenti.
Mobile HTML5 by Estelle Weyl(2117)
La Sicurezza Informatica. Tra informatica, matematica e diritto (Italian Edition) by Francesca Cirini(1878)
Hello World by Hannah Fry(1847)
Il Manuale Di Arduino by Maik Schmidt(1696)
Nel paese degli algoritmi by Aurélie Jean(1436)
Linux server per l'amministratore di rete: per Ubuntu, CentOS e Fedora (Italian Edition) by Silvio Umberto Zanzi(1435)
Esercizi Di Stile by Unknown(1217)
Sviluppare in PHP 7: Realizzare applicazioni web e API professionali (Italian Edition) by Enrico Zimuel(1035)
E-LEARNING by E-learning(1018)
PYTHON : Il manuale per imparare a programmare. Contiene esempi di codice ed esercizi pratici. (Italian Edition) by Frost Oscar R(997)
Tutto Mac for dummies: iPhone, iPad, MacBook, iCloud e molto altro by Simone Gambirasio(987)
Novacene by James Lovelock(970)
9 algoritmi che hanno cambiato il futuro by MacCormick John(907)
Automatizzare le cose noiose con Python: Programmazione pratica per principianti assoluti (Italian Edition) by Sweigart Al(904)
Comprendere gli Algoritmi e i diagrammi di flusso passo-passo: Esempi con ausili grafici e tabellari, esercizi e codifica in linguaggio C (Italian Edition) by Luciano Manelli(886)
Amazon by Sconosciuto(871)
WEB DEVELOPMENT: La guida completa allo sviluppo web lato client. Impara a programmare con esercizi pratici ed esempi di codice. Include HTML, CSS, PHP, PYTHON, MySQL (Italian Edition) by Ferrati Alberto(857)
On Writing by Stephen King(854)
Android 4 by Massimo Carli(850)