Birisi Python __all__ açıklayabilir misiniz?
Ben daha Python kullanıyorum ve ben değişken görmeye devam __all__farklı yılında seti __init__.pydosyaları. Birisi bu ne açıklayabilir?
Oluştur 04/09/2008 saat 22:28 2008-09-04 22:28
kaynak kullanıcı varikin
Bağlı, fakat burada açıkça belirtilmeyen, ne zaman tam olarak __all__kullanılır. Bu zaman ihraç edilecek bir modülde neler sembolleri tanımlayan dizeleri listesidir from <module> import *modül kullanılır.
Örneğin, bir de şu kod foo.pyaçıkça sembolleri ihraç barve baz:
Bu semboller daha sonra şöyle alınabilir:
Eğer __all__yukarıda dışarı yorum varsayılan davranışı olarak, bu kod, sonra tamamlanma çalıştırır import *verilen ad alanından, bir alt çizgi ile başlar olmayan tüm sembolleri içe aktarmaktır.
NOT: __all__ etkiler from <module> import *sadece davranış. Belirtilmeyen üyeleri __all__hala modül dışından erişilebilir ve birlikte alınabilir from <module> import <member>.
kaynak kullanıcı Alec Thomas
Tarafından yorumlandığı gibi, bu modülün kamu nesnelerin bir listesi import *. Bu alt çizgiyle başlayan herşeyi gizleme varsayılan geçersiz kılar.
Cevap 04/09/2008 saat 22:30 2008-09-04 22:30 share
Sadece bu hassas olmak ekliyorum:
Diğer tüm cevaplar bakın modüllerin . Orijinal soru explicitely sözü __all__de __init__.pydosyalar, bu nedenle bu piton hakkındadır paketleri .
Genellikle, __all__yalnızca devreye girer from xxx import *ve varyant importdeyimi kullanılır. Bu paketlere yanı sıra modüllerin için de geçerlidir.
Modülleri için davranış diğer cevaplar açıklanmıştır. Paketler için kesin davranış açıklanmıştır burada ayrıntılı olarak.
Kısacası, __all__bu ilgilenir dışında paket düzeyinde, yaklaşık modülleri için aynı şeyi yapar paket içinde modüllerin (belirterek aksine modülü içinde isimleri ). Yani __all__bize kullandığınızda Geçerli isim yüklenir ve ithal edilecek tüm modüllerini belirtir from package import *.
En büyük farkı zaman yani, ihmal ilanını __all__bir paket en içinde __init__.py, deyim from package import *(istisnalar belgelerinde açıklandığı birlikte, yukarıdaki bağlantıya bakın) hiç bir şey ithal olmayacaktır.
Eğer ihmal varsa Öte yandan, __all__bir modülde, "rol aldı ithal" modülünde tanımlanan tüm adlar (bir alt çizgi ile başlayan değil) ithal edecek.
Cevap 16/05/2013 saat 20:01 2013-05-16 20:01 share
kaynak kullanıcı MartinStettner
Python __all__ açıklar?
Ben değişken görmeye devam __all__farklı yılında seti __init__.pydosyaları.
Ne geliyor __all__do?
Bu bir modülden semantik "kamu" isimleri beyan eder. Bir isim varsa __all__, kullanıcıların kullanmak beklenir ve onlar değişmeyeceği beklentisi olabilir.
Aynı zamanda programlı etkiler sahip olacaktır:
__all__Bir modülde, mesela module.py:
Ne zaman demektir import *modülünden, sadece o isimler __all__ithal edilmektedir:
Belgeler ve kod otomatik tamamlama araçları (aslında, olmalı) da inceleyebilirler __all__bir modülden olarak temin göstermek için hangi isimler belirlemek.
__init__.py Bir dizini bir Python paketi yapar
Gönderen docs :
__init__.pyDosyaları Python paketlerini içeren dizinler olarak algılaması için gereklidir; Bu istemeden sonradan modül arama yolunda geçerli modülleri gizleme gelen böyle dize olarak ortak bir adla dizinleri önlemek için yapılır.
En basit durumda, __init__.pysadece boş bir dosya olabilir, ancak paketi ilk kod yürütmesine veya ayarlayabilirsiniz __all__değişkeni.
Yani __init__.pyilan edebilir __all__bir için paketin .
bir API Yönetme:
Bir paket içerisinde birbirlerini ithal edebilir modülden oluşur, ama bu mutlaka bir ile birbirine bağlanmış __init__.pydosyası. Bu dosya dizini gerçek bir Python paketi kılan budur. Örneğin, aşağıdakilere sahip ki:
ve module_1size vardır:
ve module_2size vardır:
Ve şimdi bu kadar gibi, paket alırken başkasının kullanabileceği tam bir api sundular:
Ve onlar doldurmasını Modüllerinizi oluştururken kullandığınız tüm diğer adlara sahip olmayacaktır packagead.
__all__ içinde __init__.py
daha çalışmadan sonra, belki modüller çok büyük ve bölmek gerektiğini karar verdik. Yani aşağıdakileri yapın:
Ve her __init__.pybir beyan __all__, örneğin module_1:
Ve module_2 en __init__.py:
Ve kolayca yerine alt paketin en modül düzeyi Alt paket düzeyinde yönetebileceğiniz API şeyler ekleyebilir. Eğer API yeni bir isim eklemek istiyorsanız, sadece güncellemek __init__.pymodule_2 içinde, örneğin:
Yayınlamaya hazır olmazsak da Bazüst düzey API, üst düzeyde __init__.pysahip olabilir:
Kullanıcıların varlığından haberdar olup olmadığını ve Bazonlar bunu kullanabilirsiniz:
bu konuda bilmiyorum ama eğer (gibi diğer araçları pydoc ) kendilerine haber olmaz.
Daha sonra zaman bunu değiştirebilir Bazprime time için hazır:
Prefixing _karşı __all__:
Varsayılan olarak, Python bir ile başlamayın bütün isimleri ihraç edecek _. Kesinlikle olabilir Bu mekanizma güveniyor. Python standart kütüphanesinde Bazı paketler, aslında, do bu itimat, ancak, bunlar örneğin, onların ithalatı için diğer ad bunu ctypes/__init__.py:
Kullanılması _tekrar isimleri adlandırma fazlalık kaldırır çünkü kongre daha şık olabilir. Ama (eğer onlardan bir sürü var ise) o ithalat yük eklenir ve öyle kolay sadece ve istediğiniz son şey süresiz sadece bir uygulama detay olması amaçlanmıştır şeyi taşıması için sahip olmaktır - sürekli bunu unutmak bir önek unuttuğu için _bir işlev adlandırırken.
Ben şahsen bir yazma __all__kodumu kullanabilir diğerleri kullandıkları ve kullanmamalıdır bilmek böylece modülleri için benim geliştirme yaşam döngüsü içinde erken.
Standart kütüphanede çoğu paketleri de kullanabilirsiniz __all__.
Ne zaman kaçınarak __all__mantıklı
Bu sopa mantıklı _yerine önek kongre __all__:
Erken gelişim modunda hala ve hiçbir kullanıcımız var ve sürekli API verdiği edilmektedir.
Belki kullanıcıya sahip, ancak ne API kapsayacak unittests varsa ve hala aktif olarak API ekleyerek ve geliştirme ayarlama yapıyor.
Kullanmanın dezavantajı __all__iki kez fonksiyonları ve sınıfları ihraç edilen isimleri yazmak zorunda olmasıdır - ve bilgi tanımları ayrı bir yerde saklanır. Biz olabilir bu sorunu çözmek için bir dekoratör kullanın.
Ben ambalaj üzerinde David Beazley konuşmasından böyle bir ihracat dekoratör için bir fikrim var. Bu uygulama CPython geleneksel ithalatçısı iyi çalışıyor gibi görünüyor. Özel bir ithalat kanca veya sisteminiz varsa, bunu garanti etmiyoruz, ancak bunu kabul etmeleri halinde, vazgeçme oldukça önemsiz - sadece elle geri adlar eklemek gerekir__all__
Yani, örneğin, bir yardımcı kütüphane, sen dekoratör tanımlarsınız:
Bir tanımlarsınız nerede ve ardından __all__, bunu yapmak:
Ve bu ana olarak çalıştırmak veya başka bir işlev tarafından ithal edip çalışıyor.
Ve API provizyon import *çok çalışacaktır:
Cevap 29/02/2016 saat 21:58 2016-02-29 21:58 share
Ayrıca pydoc gösterecektir neyi değiştirir:
Modül module1 Yardımı:
bir = 'A'
$ Pydoc modül2
Modül Module2 Yardımı:
Ben beyan __all__şeyleri canlı tercüman oturumlarında önce hiç kullanmadıysanız kullanırken de iç detaylar çizgi olarak, bunlar gerçekten yardımcı, bütün modüllerde.
Cevap 15/05/2010 saat 04:22 2010-05-15 04:22 share
kaynak kullanıcı L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
Gönderen (An Resmi olmayan) Python Referans Wiki :
Bir modül ile tanımlanan kamu isimler adında bir değişken için modülün ad kontrol ederek belirlenir __all__; tanımlanmışsa, bu da bu modül tarafından tanımlanmıştır ya da içe isimler şeritlerinin bir dizi olmalıdır. Verilen isimler __all__tüm kamu olarak kabul edilir ve var olmaya ihtiyaç vardır. Eğer __all__tanımlı değil, kamu isimleri kümesi bir alt çizgi karakteri ( "_") ile başlamayan modülün ad alanında bulunan tüm adlarını içerir. __all__tüm kamu API içermelidir. (Örneğin ithal ve modülü içinde kullanıldı kütüphane modül olarak) API parçası olmayan yanlışlıkla ihracat öğeleri önlemek amaçlanmaktadır.
Cevap 04/09/2008 saat 22:31 2008-09-04 22:31 share
__all__özelleştirir yıldız işareti içindefrom <module> import *
__all__özelleştirir yıldız işareti içindefrom <package> import *
Bir modül bir olduğunu .pyithal edilecek anlamına dosyası.
Bir paket bir bir dizindir __init__.pydosyası. Bir paketi genellikle modülleri içerir.
__all__sağlayan insanlar a "kamu" özelliklerini bilmek modülü . [ @AaronHall ] Ayrıca, pydoc onları tanır. [ @Longpoke ]
dan modül import *
Bkz nasıl swissve cheddaryerel ad haline getirilir, ancak gouda:
Olmadan __all__, herhangi bir sembol (yani bir alt çizgi ile başlamaz) mevcuttur olurdu.
Olmadan İthalat *etkilenmez__all__
dan modül ithalat adlarıyla
ithalat modülü olarak localName
In __init__.pya dosyaya paketinde __all__ kamu modülleri veya diğer nesnelerin adları ile dizeleri listesidir. Bu özellikler joker ithalatı için kullanılabilir. Modüllerin olduğu gibi, __all__özelleştirir *paketinden joker-aktarırken. [ @MartinStettner ]
İşte bir alıntı var Python MySQL Connector __init__.py :
Onlar okuyucuları ve birçok otomatik araçlar [karıştırmayın] olarak Joker ithalat ... kaçınılmalıdır.
Cevap 20/03/2016 saat 20:20 2016-03-20 20:20 share
kaynak kullanıcı BobStein-VisiBone
__all__Python modülünün genel API belgelemek için kullanılır. İsteğe bağlı olmakla birlikte, __all__kullanılmalıdır.
İşte alakalı alıntıdır Python dili referans :
Bir modül ile tanımlanan kamu isimler adında bir değişken için modülün ad kontrol ederek belirlenir __all__; tanımlanmışsa, bu da bu modül tarafından tanımlanmıştır ya da içe isimler şeritlerinin bir dizi olmalıdır. Verilen isimler __all__tüm kamu olarak kabul edilir ve var olmaya ihtiyaç vardır. Eğer __all__tanımlı değil, kamu isimleri kümesi bir alt çizgi karakteri ( '_') ile başlamayan modülün ad alanında bulunan tüm adlarını içerir. __all__tüm kamu API içermelidir. (Örneğin ithal ve modülü içinde kullanıldı kütüphane modül olarak) API parçası olmayan yanlışlıkla ihracat öğeleri önlemek amaçlanmaktadır.
PEP 8 o da zaman ithal isimleri ortak API parçası olmayan açıklık getiriyor rağmen, benzer ifadeler kullanır __all__yoktur:
Daha iyi destek içgözlem için, modüller açıkça kullanarak kamu API isimleri ilan etmeli __all__niteliğini. Ayar __all__boş listeye modül hiçbir kamu API olduğunu gösterir.
İthal isimleri daima bir uygulama ayrıntı düşünülmelidir. Onlar açıkça belgelenmiş gibi içeren modülün API parçası, olmadıkça Diğer modüller ithal isimlerle dolaylı erişime bağlı kalmamalıdırlar os.pathveya paketin __init__alt modüllerinin gelen işlevselliği sunar modülü.
Diğer yanıtlar işaret Dahası, __all__etkinleştirmek için kullanılır paketleri içe joker :
Ithalat beyanı aşağıdaki kuralını kullanır: Bir paketin eğer __init__.pykod adlı bir liste tanımlar __all__, ne zaman ithal edilmesi modül isimlerinin listesi olarak alınır from package import *karşılaşılır.
Cevap 26/04/2016 saat 01:39 2016-04-26 01:39 share
kaynak kullanıcı Mihai Capotă
Varolan cevaplara ek olarak, __all__bir liste olması gerekmez. Belgelere uyarınca importaçıklamada , tanımlanan eğer __all__bir olmalıdır dizeleri dizisi modülü tarafından tanımlanmış veya ithal isimlerdir. Yani siz de bir başlığın kullanabilir kaydetmek bazı bellek ve CPU döngülerini. Sadece modül tek kamu ad tanımlayan durumunda bir virgül unutma:
Cevap 09/01/2019 saat 14:48 2019-01-09 14:48 share
kaynak kullanıcı Eugene Yarmash
__all__etkiler from <module> import *ifadeleri.
Biz define yoksa (Örtülü) __all__, daha sonra from foo import *sadece ithalat isimleri tanımlanan olacaktır foo/__init__.py.
Biz tanımlarsanız (Explicit) __all__ = , daha sonra from foo import *hiçbir şey ithal edecek.
Biz tanımlarsanız (Explicit) __all__ = [ <name1>, ... ], daha sonra from foo import *sadece bu isimleri ithal edecek.
Örtük durumda piton ile başlayan isimler içe unutmayın _. Ancak, kullanarak bu tür isimleri ithal zorlayabilir __all__.
Sen Python dokümanı görüntüleyebilir burada .
Cevap 03/04/2018 saat 01:19 2018-04-03 01:19 share
kaynak kullanıcı Cyker
Neden benim bazı dosyaların çoğaltılan?
Django için Heroku üzerinde gunicorn Yapılandırılması
Twisted ve bükülmüş / piton / lockfile.py içinde sembolik bağı
e-posta ve şifresini kullanarak google sürücü kimlik doğrulaması - Python
Söz dizimi Hataları girdi Roma rakamı eşdeğer görüntülemek için bir Python Eğer / Elif / Else programı yaparken
Çok yılını pandalar dataframe üç aylık dizi (kış) Özü
24 saat ila 12 saat olmak üzere zamanı dönüştürür
read_sql_table sonra dask dataframe devam edemedi
Kivy asyncio kullanılarak / Image.source = 'dosya' w çökmesini
Bir piton Programı sonlandırmak mümkün