【问题标题】:When do I require using __init__.py?我什么时候需要使用 __init__.py?
【发布时间】:2015-05-26 18:56:14
【问题描述】:

我有以下结构:

/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之前它失败了。

【问题讨论】:

    标签: python python-3.x directory


    【解决方案1】:

    3.4 词汇表有这个条目

    命名空间包

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

    根据我对 PEP 的阅读,sys.path 上的目录中包含但不包含 __init__.py 的目录是潜在的命名空间目录。当run.py运行时,'.',代表/blog,被添加到sys.path的前面。因此,`/blog' 中的目录被搜索为潜在的命名空间目录。

    PEP 还说

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

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

    PEP 还注意到可能的意外效应。

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

    【讨论】:

      【解决方案2】:

      是的,从Python 3.3 开始,您不需要在您的包中包含__init__.py。详情请见PEP 420

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-17
        • 1970-01-01
        • 1970-01-01
        • 2021-09-04
        • 1970-01-01
        • 2010-09-21
        • 2018-02-25
        相关资源
        最近更新 更多