SORU
27 NİSAN 2010, Salı


Neden Python's __al__ fromlist gerektiriyor mu?

Eğer Program aracılığıyla almak için bir modül istiyorsanız, Python, yapabilirsiniz:

module = __import__('module_name')

Eğer bir submodule almak istiyorsanız, basit bir mesele olacağını düşünürdüm:

module = __import__('module_name.submodule')

Tabii ki, bu işe yaramaz; sadece module_name tekrar. Yapmanız gereken:

module = __import__('module_name.submodule', fromlist=['blah'])

Neden?fromlist gerçek değeri olmayan boş olduğu sürece önemi yok. Bir bağımsız değişken gerektiren, kendi değerlerini yok sayarak ne anlamı var?

Python şeyler beni hayat için iyi bir nedeni ama bitmiş gibi görünüyor çoğu, var olmak için, bu davranış için herhangi bir mantıklı açıklama yapamıyorum.

CEVAP
27 NİSAN 2010, Salı


Aslında __import__() davranışları tamamen __import__() aramalar import deyimi, uygulaması nedeniyle. Temelde __import__() import (iki ana kategorisi ile) çağrılabilir biraz farklı beş yolu vardır:

import pkg
import pkg.mod
from pkg import mod, mod2
from pkg.mod import func, func2
from pkg.mod import submod

İlk olarakveikinci durumda, import deyimi "en soldaki" "en sol" adı: pkg. Bu modül nesne atamak gerekir import pkg.mod sonra import deyim yerel adı kullanılmaya başlandı çünkü pkg.mod.func() yapabilirsiniz mod bir özniteliği olan bir modül nesnesi olan pkg,. Yani, __import__() işlevi "sol-en pkg. atanabilir yani" modül nesne dönmeli Bu iki import deyimleri böylece tercüme:

pkg = __import__('pkg')
pkg = __import__('pkg.mod')

Üçüncü, dördüncü ve beşinci durumda, import açıklama yapmak için daha fazla iş var atamak (potansiyel olarak) birden fazla isim var olsun modül nesne. __import__() fonksiyon tek dönüş bir nesne, ve orada gerçek bir sebep için yapmak almak her birinin isimleri modül nesne (ve bunu yapan bir uygulama çok daha karmaşık.) Basit yaklaşım (üçüncü durum) gibi bir şey olacaktır:

tmp = __import__('pkg')
mod = tmp.mod
mod2 = tmp.mod2

Ancak, eğer pkg bir paket ise işe yaramaz ve mod mod2 paketteki modüllero zaten alınmazüçüncü ve beşinci durumda olduğu gibi., __import__() fonksiyon bilmesine gerek mod mod2 adları import ifadesi olmasını erişilebilir, böylece o Eğer onlar modülleri ve denemek için al onları da. Böylece arama daha yakın

tmp = __import__('pkg', fromlist=['mod', 'mod2'])
mod = tmp.mod
mod2 = tmp.mod2

hangi nedenler __import__() deneyin ve yük pkg.mod pkg.mod2 pkg (ama mod mod2 Yok, Yok, Yok bir hata __import__() arama; üretim hatası sol import deyim.) Ama yine de bu, dördüncü ve beşinci örnek için doğru şey değil, eğer bir ara öyle olsaydı, çünkü:

tmp = __import__('pkg.mod', fromlist=['submod'])
submod = tmp.submod

sonra tmp başlamadan önce pkg ve submod öznitelik almak istiyorum pkg.mod modül yok olmuyor. Uygulama olabilirdi karar ver o zaman import açıklama yapar ek iş, bölme Paket ismi üzerinde . __import__() fonksiyonu zaten yok ve geçme isimleri, ama bu anlamına gelirdi çoğaltarak biraz çaba. Yani, bunun yerine, uygulama __import__() dönüş yaptı-en doğruyerine modülen soldakibirEğer ve sadece eğerfromlist geçti ve boş değil.

(import pkg as p 58* sözdizimi hiçbir şeyi değiştirmez bu hikaye dışında olan yerel isimlerini atanan -- __import__() işlevi görüyor hiçbir şey farklı as kullanılan tüm kalıntıları import bildirimi uygulaması.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kindlechatmail

    kindlechatma

    25 AĞUSTOS 2010
  • paikimchung

    paikimchung

    12 Mayıs 2006
  • RayperEnglishKnight

    RayperEnglis

    24 Kasım 2008