2013-03-19 50 views
0

我有以下項目結構:從包清潔進口在Python

project 
|----app.py 
|----package 
    |---__init__.py 
    |---module.py 
    |---module2.py 
    |---module3.py 
    |---.... 

__init__.py文件當前是空的。在module.py中我定義了一個類:

class UsefulClass: 
    ... 

並且在其他模塊中也有類似的定義。我app.py看起來是這樣的:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from package.module import UsefulClass 
from package.module2 import UsefulClass2 
... 

usefulclass = UsefulClass() 
usefulclass2 = UsefulClass2() 
.... 

我的問題是:我怎麼能代替這個from package.module... import UsefulClass聲明?即使現在,我也只定義了4個模塊,並且導入起來看起來很難看。我可以將它們導入__init__.py文件中,然後在app.py中只使用import package?我試過了,它給了我一個錯誤。

我正在尋找一個乾淨優雅的解決方案。

+0

您使用的是什麼版本的Python? – abarnert 2013-03-19 19:21:20

+0

另外,請告訴我們你試用了什麼,以及你得到了什麼錯誤(跟蹤回溯)。 – abarnert 2013-03-19 19:23:19

+0

在'project.package .__ init __。py'中:導入子包並使用'__all__ = [...]'''http://docs.python.org/2/tutorial/modules.html#importing-from-a-包 – hughdbrown 2013-03-19 19:26:18

回答

1

在Python 3:

package/__init__.py

from .foo import bar 

package/foo.py

bar=0 

app1.py

import package 
print(package.bar) 

app2.py:

from package import bar 
print(bar) 

無論哪種方式,其打印0,就像你想要的。

在Python 2中,只需將from .foo import bar更改爲from foo import bar即可。 (事實上​​,2.x代碼經常在Python 3中運行,但它不正確,在一些邊緣情況下它會失敗。例如,如果你的應用程序的級別爲bar.py,那麼你「會結束了bar是該模塊,而不是0。)

在現實生活中,你可能想指定從每個包和模塊__all__,你可能永遠from foo import …(如果沒有其他原因,而不是允許在交互式口譯員處用from foo import *進行測試)。

聽起來好像你說你已經試過這個,並且有錯誤。不知道究竟是什麼你試過了什麼,錯誤是什麼,以及你使用的是哪個Python版本,我不知道你可能得到了什麼錯誤,但可能你得到了錯誤


.foo指定包相關導入。說from .foo import bar的意思是「從foo模塊在與我相同的包,進口bar」。如果離開圓點,則說「從標準模塊路徑中的foo模塊導入bar」。

關於Intra-package References(及其周邊部分)的教程部分給出了一個非常簡短的解釋。 importthe import system in general的參考文檔給出了大部分細節,但PEP 328中的原始提案更詳細地解釋了細節和設計背後的基本原理。

您需要離開2.x點的原因是2.x沒有任何方法可以區分相對和絕對進口。只有from foo import bar,意思是「從我的foo模塊中找到相同的模塊,或者,如果沒有這樣的模塊,那麼標準模塊路徑中的模塊將導入bar」。

+0

是的,我使用的是Python 3.3,並嘗試'從'__init __。py'中的'foo import bar',但這不起作用。模塊名稱前的這個「點」是什麼意思?我檢查了你的答案。謝謝 – sebast26 2013-03-19 19:44:53

+0

@ sebast26:讓我更新答案來解釋。 – abarnert 2013-03-19 19:50:43