2012-07-01 97 views
4

我剛開始使用谷歌應用程序引擎,並一直在尋找好的做法和代碼組織。我的大部分問題都來自於__init__.py的混淆。如何使用__init__.py組織代碼?

我目前的測試結構看起來像

/website 
    main.py 
    /pages 
    __init__.py #1 
    blog.py 
    hello2.py 
    hello.py 
    /sub 
     __init__.py #2 
     base.py 

我想使用main.py作爲簡單地指向/頁和/頁/分的一切文件。/pages中的大多數模塊共享幾乎所有相同的導入(例如導入urllib),是否有一種方法可以定義/ pages中的所有內容導入我想要的內容,而不是將其添加到每個單獨的模塊中?

目前__init__.py#1我有

from sub.base import * 

然而,我模塊blog.py說BaseHandler(在base.py函數)沒有定義。 我的最終目標是有類似...

main.py 
from pages import * 
#be able to call any function in /pages without having to do blog.func1() or hello.func2() 
#rather just func1() and func2() 

,並能夠分享共同的進口模塊/pages__init__.py。以便他們共享例如urllib和base.py中的所有函數。感謝您花時間閱讀這篇文章,我期待您的洞察力。

+0

導入'__init__'的項目不會自動在同一個包中的模塊中使用。您仍然需要在需要的地方明確導入'BaseHandler',比如在blog.py中。 –

回答

3

聽起來就像您認爲__init__.py是包中其他模塊的初始值設定項。不是這樣。它將pages變成一個包(允許其文件和子目錄成爲模塊),並且當程序調用import pages時,它將像正常模塊一樣執行。想象一下,它改名爲pages.py

所以,如果你真的想一切轉儲到同一個命名空間,初始化#2可以包含from base import *(將在base進口一切的sub命名空間),並且blog.py可以包含from sub import *。得到它了?

+0

感謝您澄清__init__.py的用途,並讚揚這個例子!幫助很多,我現在正在獲得我想要的功能。我必須更多地玩弄它,才能真正把我的頭圍繞在它周圍,但是你讓我朝着正確的方向前進。 – Miles