2012-07-01 53 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