首页 >后端开发 >Python教程 >Python 3.3 中的包需要 `__init__.py` 文件吗?

Python 3.3 中的包需要 `__init__.py` 文件吗?

Susan Sarandon
Susan Sarandon原创
2024-12-03 08:30:11337浏览

Do I Need `__init__.py` Files for Packages in Python 3.3 ?

Python 3.3 中的命名空间包

问题:

在 Python 3.3 中,是否还需要有 __init__。导入时的py文件包吗?

答案:

不一定。 Python 3.3 引入了“隐式命名空间包”的概念,允许在没有 __init__.py 文件的情况下创建包。这些被称为命名空间包,与具有 __init__.py 文件的常规包相反。

隐式命名空间包用例:

命名空间包是专门使用的当多个库驻留在不同位置并且需要将子包贡献给同一个父包时。例如,考虑以下结构:

google_pubsub/             # Package 1
    google/                 # Namespace package
        cloud/              # Namespace package
            pubsub/         # Regular package
                __init__.py
                foo.py

google_storage/             # Package 2
    google/                 # Namespace package
        cloud/              # Namespace package
            storage/        # Regular package
                __init__.py
                bar.py

如果没有命名空间包,导入“google_pubsub”和“google_storage”都会失败,因为 Python 将常规包视为独立实体。通过从“google”和“google/cloud”目录中删除 __init__.py 文件,它们将被解释为命名空间包,从而允许 Python 解释器查找并向“google”包贡献模块和子包。

常规包与命名空间包:

在大多数情况下,建议通过使用空来坚持使用常规包__init__.py 文件。这是因为:

  • 常规包更可预测且更易于维护。
  • 许多 Python 工具和库都希望常规包能够正常运行。

结论:

虽然命名空间包在特定场景中可能有用,但它们应该谨慎使用。对于大多数开发人员和用例,建议使用带有 __init__.py 文件的常规包。仅当确实需要在包含子包的多个目录之间共享命名空间时才考虑命名空间包。

参考文献:

  • [PEP 420 - 隐式命名空间包](https://www.python.org/dev/peps/pep-0420/)
  • [Python 文档 - 常规包](https://docs.python.org/3/reference/ import.html#packages)
  • [Python 文档 - 命名空间包](https://docs.python.org/3/reference/import.html#namespace-packages)
  • [Python 导入系统中粗心的陷阱](https://www.python. org/doc/essays/import-traps/)

以上是Python 3.3 中的包需要 `__init__.py` 文件吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn