2011-12-17 9 views
5

Bir python paketindeki alt modülleri içeren dizinin (alt paket) paketin içe aktarıldığı sırada bir simge olarak görünmesinin nedenini merak ediyorum. Bu paket var Örneğin, eğer:python alma paketi - alt simge sembol tablosunda görünmemelidir

PyModTest/      Top-level package 
      __init__.py    Initialize the package 
      Source/     Subpackage holding source files 
       __init__.py 
       WildMod.py  Submodule containing a function: 'WildFunc' 

üst düzey __init__.py şöyle burada:

#!/usr/bin/env python 

from Source.WildMod import WildFunc 

ve tamlık hatırına alt düzey __init__.py şöyle :

#!/usr/bin/env python 

__all__ = ["WildMod"] 

Tamam, tercüman açmak şimdi, modülü almak ve semboller bakmak:

>>> import PyModTest 
>>> dir(PyModTest) 
['Source', 'WildFunc', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__'] 

SEE, 'Kaynak' modülü her ne kadar özellikle onu ithal etsem de ortaya çıkıyor!

Görmek istediğim tek simge (özel olanların yanında) benim 'WildFunc'. 'Kaynak' paketini gizlemek için herhangi bir yolu var mı? Burada dikkat edilmesi gereken

cevap

6

İki şey: Python

  • , modüller gerçek nesnelerdir ve isimleri arasında görünen nokta Source yani bir nispi ithalat yapıyoruz
  • gerçek nitelik erişimini temsil PyModTest.Source.WildMod.WildFunc ithal etmek amacıyla, Python

    zorundadır: Yani aslında PyModTest.Source (bu işaret için TokenMacGuy sayesinde)

olduğunu

  • çek (zaten sizin tarafından yapıldı) ve Source adlı bir öznitelik olup olmadığını görmek ve değilse PyModTest/Source/__init__.py
  • çek aktararak özellik oluşturun ve o olup olmadığını görmek
    1. ithalat PyModTest bir öznitelik WildMod denilen, ve değilse, PyModTest/Source/WildMod.py
    2. çek aktararak özellik oluşturun ve o (öyle ki) WildFunc adlı bir öznitelik
    olup olmadığını görmek

    Bazı ilgili ayrıntılar PEP 302 ve Python language reference'da ele alınmıştır.

    mekanizmasında aşağı Derin, noktalı adı ithalat bileşenlerinin tarafından ayrılmıştır. "import spam.ham" için, önce "import spam" bitmiştir ve yalnızca bu başarılı "ham" "spam" alt modülü olarak içe aktarıldığında.

    Eğer Source adında bir değişken olmasını istemiyorsanız

    , düzeltmek kolaydır: Eğer işlevi içe sadece del Source sonra. Ancak, daha sonra çalışan herhangi bir kodun PyModTest.Source.<anything> erişiminden (WildFunc, bunun için bir referans kaydettiğinizden) engelleneceğini unutmayın.Hiçbir şey incitmediği için, sadece silme işlemini Source numaralı referansa almamaktan kesinlikle vazgeçiririm.

  • +0

    Harika, bu mantıklı. 'Del Kaynak' ile ilgili öneriniz için teşekkürler :) – rokuingh

    +2

    'Kaynak 'PyModTest'in bir alt paketidir, örtülü içe aktarma sessizce PyModTest.Source import ...'' a dönüştürülür ve böylece 'Source' modülü PyModTest modülünün bir özelliği olarak eklenmelidir. Eğer 'Kaynak' PyModTest paketinin dışında bulunduysa (olası olmayan, alt paketler sys.path' üzerinde önceliklidir), bu gerçekleşmeyecekti. Kendinizi ve başkalarını karıştırmamak için mutlaka mutlak ithalatı tercih edin. – SingleNegationElimination

    +0

    @TokenMacGuy: ah, iyi yakalayın. Her nasılsa bu göreceli bir ithalat olduğu gerçeğini özledim. –