【问题标题】:python __init__.py proved to be irrelevant in 3.4?python __init__.py 在 3.4 中被证明是无关紧要的?
【发布时间】:2016-05-11 04:56:57
【问题描述】:

我在同一目录中的 main.py 文件上运行 python 3.4。 /root 目录不在 python 路径中。它只是脚本正在执行的当前目录。每次测试后都删除了所有 pycache 文件夹

那么为什么__init__.py 很重要呢?我认为这是必要的,如这篇文章所述:

What is __init__.py for?

如果您删除 init.py 文件,Python 将不再在该目录中查找子模块,因此尝试导入模块将失败。

现在,在我看来,__init__.py 只不过是一个 可选 构造函数,我们在其中进行内务管理和其他可选操作,例如指定“all”变量等。但不是关键拥有的物品。

显示测试结果的图片:

这是怎么回事?

【问题讨论】:

  • 我是个大菜鸟,看了你发的链接,我不是特别明白。命名空间包和普通包到底有什么区别?我是否必须将其上传到 pypi 才能成为“包”。 “包”这个词在 python 中被过度使用,并且在不同的上下文中指代不同的事物。你能更具体一点来帮助我们新手吗? @vaultah
  • 好吧,你可以阅读Namespace vs regular package和PEP 420
  • 我也读过,所有的解释似乎都在重申同样的口头禅 >命名空间包可能没有物理表示 >命名空间包是一个虚拟包,其内容可以分布在 Python 查找的各个地方小路。 > 有时,如果作为小鸡蛋的集合分发,大包装会更有用。但是,Python 通常不允许从多个位置检索包的内容。 “命名空间包”是这个问题的解决方案。这些例子模棱两可,没有提供有效的例子@vaultah
  • 那么初始化文件本质上是完全可选的吗?它仅充当家政指导员,我们可以在没有 init 的情况下使用文件夹,就像我们可以在 php 中使用它们一样,例如,组织代码?所以 init 更像是一个警告而不是一个要求? @vaultah

标签: python module packages python-3.4


【解决方案1】:

回答

基本上我们不需要 init.py,它的目的是用于遗留和可选的内务处理(2.7 与 3),您可能想要或可能不想做或需要。但同时,在更复杂的解析过程中,它们的行为略有不同,如果您正在构建更复杂的东西,也应该考虑到这一点

更多阅读材料请参考以下链接

https://www.python.org/dev/peps/pep-0420/#namespace-packages-today

How do I create a namespace package in Python?

What's the difference between a Python module and a Python package?

https://softwareengineering.stackexchange.com/questions/276888/python-namespace-vs-module-with-underscores

【讨论】:

    【解决方案2】:

    尽管可能会令人困惑,但即使没有 __init__.py 文件,基本功能也可以使用,但您可能仍应使用它们。没有它们,许多外部工具以及标准库中与包相关的函数将无法按预期工作。更多智慧之言(以及误导性的公认答案):Is __init__.py not required for packages in Python 3.3+

    【讨论】:

      猜你喜欢
      • 2018-09-21
      • 2016-09-05
      • 2015-08-19
      • 2015-07-13
      • 1970-01-01
      • 2020-05-07
      • 2016-02-01
      • 1970-01-01
      相关资源
      最近更新 更多