2016-05-10 16 views
49

Sto usando Python 3.5.1. Ho letto il documento e la sezione pacchetto qui: https://docs.python.org/3/tutorial/modules.html#packages__init__.py non è richiesto per i pacchetti in Python 3?

Ora, io ho la seguente struttura:

/home/wujek/Playground/a/b/module.py 

module.py:

class Foo: 
    def __init__(self): 
     print('initializing Foo') 

Ora, mentre in /home/wujek/Playground:

~/Playground $ python3 
>>> import a.b.module 
>>> a.b.module.Foo() 
initializing Foo 
<a.b.module.Foo object at 0x100a8f0b8> 

Analogamente, ora in casa, superfolder di Playground:

~ $ PYTHONPATH=Playground python3 
>>> import a.b.module 
>>> a.b.module.Foo() 
initializing Foo 
<a.b.module.Foo object at 0x10a5fee10> 

In realtà, posso fare tutti i tipi di cose:

~ $ PYTHONPATH=Playground python3 
>>> import a 
>>> import a.b 
>>> import Playground.a.b 

Perché fa questo lavoro? Anche se ci dovevano essere i file __init__.py (quelli vuoti avrebbero funzionato) in entrambi a e b per module.py essere importabili quando il percorso Python punta alla cartella Playground?

Questo sembra essere cambiato da Python 2.7:

~ $ PYTHONPATH=Playground python 
>>> import a 
ImportError: No module named a 
>>> import a.b 
ImportError: No module named a.b 
>>> import a.b.module 
ImportError: No module named a.b.module 

Con __init__.py sia ~/Playground/a e ~/Playground/a/b funziona benissimo.

risposta

57

Python 3.3+ ha Implicit Namespace Packages che consente di creare pacchetti senza un file __init__.py.

Permettere pacchetti namespace implicite significa che l'obbligo di fornire un file __init__.pypuò essere eliminato completamente, e colpite ....

Il vecchio modo con __init__.py file funziona ancora come in Python 2.

+4

farò leggere il documento, ma è un po 'lungo. È possibile riassumere rapidamente?Potresti semplicemente dirmi: supporta ancora __init__.py o li ignora completamente? Se li supporta, qual è la differenza di funzionalità e perché questa dualità? – wujek

+1

Sì, funziona ancora. Quindi tutti i pacchetti Python 2 con i file '__init __. Py' funzioneranno in termini di importazioni (altre differenze tra Python 2 e 3 non sono considerate qui). –

+1

Quindi il tutorial dovrebbe essere probabilmente aggiornato. È stato aperto un bug della documentazione? –

2

@ risposta di Mike è corretto, ma troppo impreciso. È vero che Python 3.3+ supporta Pacchetti spazio dei nomi impliciti che consente di creare un pacchetto senza un file __init__.py.

Questo tuttavia, si applica SOLAMENTE ai file EMPTY __init__.py. Quindi i file EMPTY __init__.py non sono più necessari e possono essere omessi. Se si desidera importare moduli in un pacchetto, è comunque necessario un file __init__.py che elenchi tutte le importazioni.

Directory Structure Esempio:

parent_package/ 
    __init__.py   <- EMPTY, NOT NECESSARY in Python 3.3+ 
    child_package/ 
      __init__.py  <- STILL REQUIRED to import all child modules 
      child1.py 
      child2.py 
      child3.py 

__init__ file in child_package:

import child1 
import child2 
import child3 
Problemi correlati