2016-01-23 10 views
5

Supponiamo che io sono:Python 3 non ha bisogno di __init__.py in questa situazione?

src/ 
    __init__.py 
    a.py 
b.py 

Supponiamo __init__.py è un file vuoto, e a.py è appena una linea:

TESTVALUE = 5 

Supponiamo b.py è:

from src import a 

print(a.TESTVALUE) 

Ora sia in Python 2.7 e Python 3.x, eseguendo b.py fornisce il risultato (5).

Tuttavia, se elimino il file __init__.py, b.py funziona ancora in Python 3.x, ma in Python 2.7, ottengo l'errore:

Traceback (most recent call last): 
    File "b.py", line 5, in <module> 
    from src import a 
ImportError: No module named src 

Perché Python 2.7 mostrano un comportamento diverso in questa situazione?

risposta

8

Python 3 supporta namespace packages che funziona senza un file __init__.py. Inoltre, questi pacchetti possono essere distribuiti su più directory. Ciò significa che tutte le directory sul tuo sys.path contenenti file *.py verranno riconosciute come pacchetti.

Questo rompe la compatibilità con le versioni precedenti in Python 3 in termini di importazioni. Un tipico problema è una directory nella directory di lavoro corrente che ha un nome come una libreria come numpy e che contiene file Python. Mentre Python 2 ignora questa directory, Python 3 lo troverà per primo e cercherà di importare la libreria da lì. Questo mi ha morso più volte.

Problemi correlati