2012-09-20 13 views
5

kullanımı __init__.py kullanıyorum from myprojects.something import blabla yaptığımda denetimleri çalıştırmak için kullanıyorum.__init__.py

Bugün pyzmq'u kullanmaya başladım ve sahnelerin ardında neler olduğunu görmek istedim. Bu yüzden kodu github'a götürebilirim ve kendimi açıklayamayacağım (benim için) __init__.py'un bazı garip kullanımlarını buldum.

Örneğin zmq/core/__init__.py. zmq.core.__all____all__'un 'un değeri nedir? zmq/__init__.py yılında

Sonuna get_includes temelde modülün dizin ve üst dizinde utils dizinine sahip bir liste döndüren bir fonksiyondur

__all__ = ['get_includes'] + core.__all__ 

de görüyoruz.

Bunun anlamı nedir? Bunu yaparak __init.py__ ne elde etti?

cevap

11

__all__, bir kullanıcının from module import * belgesinin here belgelendiği zamanki içindir.

Tek çözüm, paket yazarı için paketin açık bir dizinini sağlamasıdır. İçe aktarma bildirimi aşağıdaki kuralını kullanır: bir paketin __init__.py kodu, __all__ adlı bir listeyi tanımlarsa, paket alma * ile karşılaşıldığında içe aktarılması gereken modül adlarının listesi alınır. paketinin yeni bir sürümü çıktığında bu listeyi güncel tutmak paket yazarına kalmıştır. Paket yazarlar, paketlerinden * ithal etmek için bir kullanım görmüyorlarsa, 'u desteklememeye de karar verebilirler.

__all__ = ["echo", "surround", "reverse"] 

Bu from sound.effects import * ses paketinin üç adlandırılmış submodules ithal edeceği anlamına gelecektir: Örneğin, dosya sounds/effects/__init__.py aşağıdaki kodu içerebilir. __all__ için

bir kullanımı onlara kullanıcılar için uygun hale ederken onlar için uygun olacak şekilde kendi paketini yapılandırmaya izin paket inşaatçılar için bir araçtır.

import zmq 
print zmq.zmq_version() 

Aksine tam noktalı modül adı kullanmak zorunda kalmadan daha:

print zmq.core.version.zmq_version() 

pyzmq tasarımcıları __all__ kullandığınız paket teşvik etmek Özellikle pyzmq durumunda, bu gibi kod yazmak sağlar Kullanıcı adlarını, kendi ad alanının en üst düzeyine kadar iç içe modülleri kullanarak, kullanıcının paketlerinin yapısından rahatsız etmemesini sağlar.

+0

Burada sormadan önce belgelerin bu bölümünü okudum. Ama bu hala soruma cevap vermiyor. Belki de başka bir şekilde sormalıyım: “bla import ble” yi kullanmanın sebebi, ad alanınız üzerinde kontrol sahibi olmanızdır, yani adınıza hangi simgeleri eklediğinize karar vermenizdir. – Pablo

+0

"# include" işlevinin kullanılmasının, önceden tanımlanmış işlevler, değişkenler vb. Ile çarpışmaya neden olabileceği C'nin aksine, gerçekten ihtiyacınız olan sembolleri almanız gerekir. Ben python belgelerinde bir yere okudum, çünkü 'bla import * 'kullanarak iyi bir alışkanlık değildi. Eğer öyleyse, neden '__ all__' tanımlamayı rahatsız etsin? Ve 'import *' yaparken __all__ = ['get_includes'] + core .__ all__' nasıl değerlendirilir? Bla import * dan – Pablo

+1

, içeri girmek için iyi bir alışkanlık değildir, ancak genellikle güvenli olan bazı modüller vardır. Matematik ithalatından rutin olarak yapıyorum *. Bu modüllerin belgelenmesi, genellikle bu şekilde kullanılmak üzere tasarlandıklarına ve bunu daha kolay hale getirmek için __all__ gibi nişanlara destek olduklarına işaret eder. Fakat x import * 'dan emin olmak için kullanacağınız bir şey var ve sadece bildiğiniz paketlerle sorun yaratmayacaksınız. – TimothyAWiseman

İlgili konular