2014-09-21 26 views
1

如何避免類/方法/等的多個位置。在一個python包的命名空間中?考慮一個包含以下目錄結構和代碼的包:禁止子模塊出現在名稱空間w/__init__.py

dummyproj/ 
├── __init__.py 
└── main.py 

# main.py 
# ======= 
def dummy_func(): 
    print "hello world" 

# __init__.py 
# =========== 
from main import * 

有了這種結構,函數dummy_func可在包中找到。但是,它也可以從名爲main的子模塊中獲得。例如:

>>> import dummyproj 
>>> dir(dummyproj) 
['__builtins__', 
'__doc__', 
'__file__', 
'__name__', 
'__package__', 
'__path__', 
'dummy_func', 
'main'] 
>>> dummyproj.dummy_func() 
hello world 
>>> dummyproj.main.dummy_func() 
hello world 

我將如何防止main不再出現在dummy_proj命名空間呢?我的理解是,將dummy_func的代碼包含在__init__.py中將是錯誤的形式。

+0

因此,儘管'dummy_func'出現在兩個地方,那麼這是一種可以接受的做法嗎? – 2014-09-21 22:04:16

+0

感謝您的幫助,盧卡斯。我對'requests'模塊有點熟悉,所以這是一個有效的例子。你介意提交一些這樣的答案作爲答案,這樣我可以將其標記爲接受? – 2014-09-21 22:18:34

回答

1

你不能(在清潔和普遍接受的方式)。

但問題是,你爲什麼要?理想情況下,您的圖書館的用戶將使用您的文檔來了解您的圖書館的API,並且不必訴諸於使用dir()

如果我正在調試你的庫,如果使用dir(),我可能會這樣做,我不想讓庫的結構混淆。

所以剛纔構建你的包是完全可以接受的,大多數圖書館都建立這樣,你在你的例子做的方式:

  • 使用子模塊/包,可能是幾個人的水平,構建一個代碼明智的方式
  • 然後,在頂層用於包裝經常使用的功能/類提供方便的進口/等

一個非常好的考試PLE是requests模塊:

import requests 
requests.get(url) 

get()功能被提供爲convenience import at the top-level package,並且還記載,方式(quickstart docs | API docs)。但get()函數實際上生活在requests.api.get


另一個很好的例子是SQLAlchemy,甚至使用便利進口的幾個層次:

Column類生活在sqlalchemy.sql.schema.Column。但它提供的便利導入爲sqlalchemy.schema.Column,甚至在頂部爲。 (儘管sqlalchemy.schema命名空間只是出於兼容性的原因,據我所知)。

0

有沒有簡單的方法來做到這一點。 (至少我知道)

你可以使用del來清理它,或者你可以使用函數來爲你生成模塊。像這樣:(在__init__.py)。

def __init__mod(): 
    from main import dummy_func 

    g = globals() 
    g['dummy_func'] = dummy_func 

__init__mod() 
0

只需把它刪掉你__init__.py文件:

# __init__.py 
# =========== 
from main import * 
del main 
相關問題