我什么时候需要使用__init__.py?

时间:2015-03-23 17:06:53

标签: python python-3.x directory

我有以下结构:

/blog
    /app
        /static
            staticfile.py
        /templates
            templatefile.py
    run.py

我有run.py

from app.static import staticfile

print("you run me")

staticfile.py print("ran from staticfile")

当我跑python run.py时,我明白了,

ran from staticfile
you run me

我没有__init__.py任何地方,我没有虚拟环境。如果没有__init__.py文件,我的参考如何工作?是因为我使用的是Python 3.4吗?如果重要的话,我在Windows 7中。

编辑:我能说的最好是因为我在3.4。我明确使用了C:\python27\python run.py,但在我放__init__.py之前它失败了。

2 个答案:

答案 0 :(得分:2)

3.4词汇表有此条目

  

命名空间包

     

PEP 420包装,仅用作子包装的容器。   命名空间包可能没有物理表示,并且   特别是不像普通包装,因为他们没有    init .py文件。

从我对PEP的阅读中,sys.path但不包含__init__.py的目录中包含的目录是潜在的命名空间目录。运行run.py后,代表'.'的{​​{1}}会添加到/blog的前面。因此,`/ blog'中的目录被搜索为潜在的命名空间目录。

PEP也说

  

如果开发人员知道她的包裹永远不会成为其中的一部分   命名空间包,然后它有一个性能优势   常规包(使用 init .py)。创建和加载常规   包装可以沿路径定位时立即进行。   使用命名空间包时,必须扫描路径中的所有条目   在创建包之前。

换句话说,sys.path上的每个目录都可能会搜索sys.path包中的其他模块,而不是停留在app.static'.')。我会继续添加您认为必需的/blog个文件。

PEP也注意到了可能的意外效果。

  

请注意,将不再为目录引发ImportWarning   缺少 init .py文件。这样的目录现在将导入为   命名空间包,而在以前的Python版本中是ImportWarning   会被提出来。

答案 1 :(得分:0)

是的,从Python 3.3开始,您不需要在包中加入__init__.py。有关详细信息,请参阅PEP 420