浅谈Python中的包

浅谈,python · 浏览次数 : 112

小编点评

__init__.py文件是用于构建 Python 模块命名空间的方法。它包含一些初始化代码,例如导入其他文件或设置模块属性。 __init__.py文件可以包含以下内容: * **代码**:用于执行初始化代码的 Python 代码。 * **空文件**:空文件也可以用于初始化,但它不能被 Python 读取。 * **导入**:用于导入其他文件或模块的代码。 * **模块属性设置**:用于设置模块属性的代码。 __init__.py文件必须存在于 package 目录中,因为 Python 会自动搜索 package 目录寻找 __init__.py 文件。

正文

浅谈Python中的包

Package的定义(你以为的)

  • 你在很多的地方都能看到关于package的定义:在Python中在当前目录下有__init__.py文件的目录即为一个package。

  • 嗯,包括python目前的官网文档也是类似这么介绍的

    https://docs.python.org/zh-cn/3.9/tutorial/modules.html#packages
    
    Python 只把含 __init__.py 文件的目录当成包
    
    https://docs.python.org/3.9/tutorial/modules.html#packages
    
    The __init__.py files are required to make Python treat directories containing the file as packages
    

3.9如此,3.11也是的,可能是文档维护人员的工资没发?

Package的定义(应该是这样的)

  • 然在上面的文档中,有这样一句
    • 包是一种用“点式模块名”构造 Python 模块命名空间的方法
    • Packages are a way of structuring Python’s module namespace by using “dotted module names”.

我认为是比较符合当前的设定的

是否需要初始化文件

https://realpython.com/lessons/package-initialization/

  • 看上面这个文章,尾部有这样的一段说明
Much of the Python documentation states that an __init__.py file must be present in the package directory when creating a package. This was once true. It used to be that the very presence of __init__.py signified to Python that a package was being defined. The file could contain initialization code or even be empty, but it had to be present.

Starting with Python 3.3, Implicit Namespace Packages were introduced. These allow for the creation of a package without any __init__.py file. Of course, it can still be present if package initialization is needed. But it is no longer required.
  • 简陋的翻译一下
很多的python文档说__init__.py必须要存在于package目录中,当你创建一个package的时候(注:事实上IDE如pycharm也是这么做的,默认就给你创建了..)。这曾经是对的。曾经它出现在一个python的目录中就表示了你在创建一个包。这个__init__.py文件可以包含初始化文件或者为空,但它必须存在。

从Python3.3开始,开始引入了隐式命名空间包的概念。这就允许了创建包的时候不需要__init__.py。当然如果一个包要初始化,它仍然是需要的。但是,不再是必要的!

PEP 420 Implicit Namespace Packages

  • 在Specification章节

    Regular packages will continue to have an __init__.py and will reside in a single directory.
    
    Namespace packages cannot contain an __init__.py
    
  • 它也提到了namespace packages和regular packages的区别

    • Portions of namespace packages need not all come from the same directory structure, or even from the same loader. Regular packages are self-contained: all parts live in the same directory hierarchy.
    • Namespace packages have no __file__ attribute.
    • Namespace packages’ __path__ attribute is a read-only iterable of strings, which is automatically updated when the parent path is modified.
    • Namespace packages have no __init__.py module.
    • Namespace packages have a different type of object for their __loader__ attribute

这个区别实在不好测试,比想象的要繁琐很多

一个简单的测试

  • 目录结构

    D:\pythonProject\AutoTest\PackageTest (7.08KB)
    
    ├── NamespacePack (2b)
    
    │   ├── demoNP.py (24b)
    
    
    ├── RegularPack (35b)
    
    │   ├── demoRP.py (24b)
    
    │   ├── __init__.py (2b)
    
    └── testPack.py (114b)
    
    
  • 区别就是在pycharm上创建一个目录NamespacePack,创建一个package(RegularPack)

  • demoNP.py

    nameNP = 'NamespacePack'
    
  • demoRP.py

    nameRP = 'RegularPack'
    
  • __init__.py为空

  • testPack.py

    from NamespacePack.demoNP import nameNP
    from RegularPack.demoRP import nameRP
    
    print(nameNP)  # 输出NamespacePack
    print(nameRP)  # 输出RegularPack
    
  • 跟普通的包似乎没有任何区别(至少我感知不到)

说在最后

  • 初学者(我也算)无需纠结细节
  • 只需知道python中的包并不一定要__init__.py,over

与浅谈Python中的包相似的内容:

浅谈Python中的包

浅谈Python中的包 Package的定义(你以为的) 你在很多的地方都能看到关于package的定义:在Python中在当前目录下有__init__.py文件的目录即为一个package。 嗯,包括python目前的官网文档也是类似这么介绍的 https://docs.python.org/zh

漫谈Python魔术方法,见过的没见过的都在这里了

漫谈Python魔术方法,见过的没见过的都在这里了 就说一下,不深入 假的一览 提到魔术方法,学过python都应该知道一些。至少你得会__init__吧。 在我之前写的博文中有很多都涉及魔术方法。比如 浅谈Python中的if,可能有你不知道的,涉及__bool__和__len__ 浅谈Pytho

《最新出炉》系列初窥篇-Python+Playwright自动化测试-4-playwright等待浅析

1.简介 在介绍selenium的时候,宏哥也介绍过等待,是因为在某些元素出现后,才可以进行操作。有时候我们自己忘记添加等待时间后,查了半天代码确定就是没有问题,奇怪的就是获取不到元素。然后搞了好久,或者经过别人的提示才恍然大悟没有添加等待时间。而playwright为了避免我们犯这么low的错误,

浅谈k8s中cni0和docker0的关系和区别

最近在复习k8s网络方面的知识,查看之前学习时整理的笔记和文档还有过往自己总结的博客之后发现一个问题,就是在有关flannel和calico这两个k8s网络插件的文章和博客中,会涉及到cni0和docker0这两个网桥设备,但是都没有明确说明他们俩之间的关系,有的甚至将两者混为一谈,这也是我之前的学

浅谈性能测试稳定性 Constant Throughput Timer(常数吞吐量定时器)

在性能测试过程中总会收到一些需求如:单接口每秒并发20,这种并发持续60秒,通过负载测试查看系统稳定性,今天就让我们来浅谈一下这种场景如何去实现性能测试~

浅谈如何向上管理

最近听说了很多事,加之目前自己也处在被汇报以及需要向上汇报的状态中间,迫使我开始思考向上管理(managing up)这个话题。这是一个有争议的话题,很多人(包括曾经的自己)下意识的会将向上管理与徒有其表的讨好或者迎合这类负面词划上等号。借此契机在查阅了很多资料之后,才意识到它不过是一项职场软技能而已。

[转帖]浅谈系统稳定性与高可用保障的几种思路

https://segmentfault.com/u/dewujishu 一、前言 高并发、高可用、高性能被称为互联网三高架构,这三者都是工程师和架构师在系统架构设计中必须考虑的因素之一。今天我们就来聊一聊三H中的高可用,也是我们常说的系统稳定性。 本篇文章只聊思路,没有太多的深入细节。阅读全文大概

[转帖]浅谈RAID写惩罚(Write Penalty)与IOPS计算

介绍 通常在讨论不同RAID保护类型的性能的时候,结论都会是RAID-1提供比较好的读写性能,RAID-5读性能不错,但是写入性能就不如RAID-1,RAID-6保护级别更高,但写性能相对更加差,RAID10是提供最好的性能和数据保护,不过成本最高等等。其实决定这些性能考虑的因素很简单,它就是RAI

[转帖]浅谈RAID写惩罚(Write Penalty)与IOPS计算_文字版

https://www.cnblogs.com/IvanChen/p/4491984.html 介绍 通常在讨论不同RAID保护类型的性能的时候,结论都会是RAID-1提供比较好的读写性能,RAID-5读性能不错,但是写入性能就不如RAID-1,RAID-6保护级别更高,但写性能相对更加差,RAID

[转帖]张磊:浅谈容器网络

https://zhuanlan.zhihu.com/p/595014129 你好,我是张磊。今天我和你分享的主题是:浅谈容器网络。 在前面讲解容器基础时,我曾经提到过一个Linux容器能看见的“网络栈”,实际上是被隔离在它自己的Network Namespace当中的。 而所谓“网络栈”,就包括了