如何使用__init__.py进行代码组织?

4

我刚开始使用 Google App Engine,一直在寻找良好的实践和代码组织方式。我的大部分问题来自于对 __init__.py 的困惑。

我当前的测试结构如下:

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

我希望使用 main.py 作为一个文件,简单地指向 /pages 和 /pages/sub 中的所有内容。/pages 中的大多数模块都共享几乎相同的导入(例如:import urllib)。有没有办法定义 /pages 中的所有内容都导入我想要的东西,而不是在每个单独的模块中添加它呢?
目前在 __init__.py #1 中,我有:
from sub.base import *

我的模块blog.py提示base.py中的BaseHandler函数未定义。 我的最终目标是得到类似于...的东西。
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文件中共享模块的公共导入,以便它们可以共享来自base.py的urllib和所有函数。感谢您抽出时间来阅读这篇文章,期待您的见解。


导入到 __init__ 中的项目不会自动在同一包中的模块中可用。您仍然需要在需要的地方显式导入 BaseHandler,例如在 blog.py 中。 - Martijn Pieters
1个回答

3
听起来你似乎认为__init__.py是包中其他模块的初始化器,但实际上不是这样。它将pages转化为一个包(允许其文件和子目录成为模块),并且在你的程序调用import pages时像普通模块一样被执行。想象一下如果它被命名为pages.py
所以如果你真的想把所有东西都倒入同一个命名空间,init #2可以包含from base import *(它将base中的所有东西导入到sub的命名空间中),blog.py可以包含from sub import *。明白了吗?

感谢对 init.py 目的的澄清,并为示例点赞!这帮了我很多,现在我正在获得我想要的功能。我需要更多地尝试才能真正理解它,但你已经让我朝着正确的方向前进了。 - Miles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接