Programmare con Python: Guida completa by Marco Buttu

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



Disconoscimento:
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.
Ebooks popolari
Designing Mobile Interfaces by Steven Hoober & Eric Berkman(2153)
Mobile HTML5 by Estelle Weyl(2101)
La Sicurezza Informatica. Tra informatica, matematica e diritto (Italian Edition) by Francesca Cirini(1866)
Hello World by Hannah Fry(1828)
Il Manuale Di Arduino by Maik Schmidt(1680)
Nel paese degli algoritmi by Aurélie Jean(1428)
Linux server per l'amministratore di rete: per Ubuntu, CentOS e Fedora (Italian Edition) by Silvio Umberto Zanzi(1421)
Esercizi Di Stile by Unknown(1200)
Sviluppare in PHP 7: Realizzare applicazioni web e API professionali (Italian Edition) by Enrico Zimuel(1015)
E-LEARNING by E-learning(1014)
PYTHON : Il manuale per imparare a programmare. Contiene esempi di codice ed esercizi pratici. (Italian Edition) by Frost Oscar R(982)
Tutto Mac for dummies: iPhone, iPad, MacBook, iCloud e molto altro by Simone Gambirasio(977)
Novacene by James Lovelock(960)
9 algoritmi che hanno cambiato il futuro by MacCormick John(900)
Automatizzare le cose noiose con Python: Programmazione pratica per principianti assoluti (Italian Edition) by Sweigart Al(896)
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(876)
Amazon by Sconosciuto(860)
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(849)
On Writing by Stephen King(846)
Android 4 by Massimo Carli(846)