2016-05-10 24 views
49

Python 3.5.1 kullanıyorum. Ben belgeyi ve burada paket bölümünü okuyun: Şimdi https://docs.python.org/3/tutorial/modules.html#packagesPython 3 paketlerinde __init__.py gerekli değil mi?

, aşağıdaki yapıya sahiptir:

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

module.py: Şimdi

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

/home/wujek/Playground ise:

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

Benzer şekilde, şimdi evde, 012 süper klasörü: Aslında

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

, ben hepsi bir sürü yapabilirsiniz:

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

Neden bu işler? a ve module.py için dosyaları (boş olanlar çalışacak) olması gerekiyordu, ancak Python yolu Playground klasörüne işaret ettiğinde, içe aktarılabilir olmak gerekiyordu.

Bu görünüyor

Python 2.7 den değişmiş:

~ $ 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 

__init__.py ile ~/Playground/a ve ~/Playground/a/b iyi çalışıyor hem de.

cevap

57

Python 3.3+, __init__.py dosyası olmadan bir paket oluşturmanıza izin veren Implicit Namespace Packages dosyasına sahiptir. örtülü ad paketleri izin

gereksinimi ... tamamen düştü ve etkilenebilir bir __init__.py dosyayı temin etmek anlamına gelir. Ahmet'in cevabın doğru ama çok belirsiz bir nitelik @

__init__.py dosyaları ile eski yolu hala

+4

Ben belgeyi okuyacak, ama biraz uzun. Hızlı bir şekilde özetlemek mümkün mü?Bana söyler misiniz: hala __init__.py dosyasını destekliyor mu, yoksa tamamen yok sayar mı? Onları destekliyorsa, işlevsellikteki fark nedir ve neden bu ikilik? – wujek

+1

Evet, hala çalışıyor. Bu nedenle, tüm Python 2 paketleriniz '__init __. Py' dosyaları ile ithalat açısından çalışacaktır (burada dikkate alınmayan Python 2 ve 3 arasındaki diğer farklar). –

+1

Yani eğitim muhtemelen güncellenmelidir. Bunun için bir dokümantasyon hatası mı açıldı? –

2

Python 2'deki gibi çalışır. Python 3.3+, __init__.py dosyası olmadan bir paket oluşturulmasına izin veren örtük Ad Alanı Paketleri desteğini desteklemektedir. Ancak bu, YALNIZCA, EMPTY __init__.py dosyaları için geçerlidir. Yani EMPTY __init__.py dosyaları artık gerekli değildir ve ihmal edilebilir. Modülleri bir pakete almak istiyorsanız, tüm içe aktarma listelerini içeren bir __init__.py dosyaya ihtiyacınız olacaktır.

Dizin Yapısı Örnek: child_package yılında

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__ dosyası:

import child1 
import child2 
import child3