0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解python常规包与命名空间包

python爬虫知识分享 ? 来源:python爬虫知识分享 ? 作者:python爬虫知识分享 ? 2022-03-11 15:46 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

python常规包与命名空间包

1. 常规包

在 Python 3.3 之前或者说 Python 2 中,一个包想要被导入使用,那么该包内必须要有 __init__.py 文件,这个文件是 Python 识别一个文件夹是否是一个 Python 的重要标志。

举个例子,现在有如下的目录树,demo 及子文件夹 foo 和 bar 下都有 __init__.py 文件。

$ tree demo/
demo/
├── bar
│ └── __init__.py
├── foo
│ └── __init__.py
└── __init__.py

在该目录下进入 Python Console 模式,然后就可以正常导入了

>>> import demo
>>> import demo.bar
>>> import demo.foo

如果此时我把 demo 目录下的 __init__.py 删除

$ tree demo/
demo/
├── bar
│ └── __init__.py
└── foo
    └── __init__.py

再导入就会报错。

>>> import demo
Traceback (most recent call last):
  File "", line 1, in 
ImportError: No module named demo

2. 命名空间包

在 Python 3.3 之后(PEP 420),即使一个文件夹中没有定义 __init__.py,也是可以被导入的,只不过它不是以 Python 包的形式导入,而是以命名空间包 (Namespace package) 的形式被导入,而这一特性是在 Python 3.3 被引入的。

比如还是上面的目录结构:

$ tree demo/
demo/
├── bar
│ └── __init__.py
└── foo
    └── __init__.py

在 Python 3 下进入 Python Console 模式,发现导入是正常的

>>> import demo
>>> import demo.foo
>>> import demo.bar

使用 __path__ 查看一下,发现 demo 不再是一个常规包了,而是一个 namespace package

>>> demo

>>>
>>> demo.__path__
_NamespacePath(['/root/python/demo'])

3. 空间命名包的好处

利用命名空间包这个技术,可以用来导入目录分散的代码。

比如有如下的目录树

$ tree
.
├── xc-pkg
│ └── demo
│     └── foo
│         └── __init__.py
└── xm-pkg
    └── demo
        └── bar
            └── __init__.py

在这 xc-pkgxm-pkg 这两个目录里,都有着共同的命名空间 demo。这时候再导入这两个包的时候,发现这两个包被合并到一起了

>>> import sys
>>> sys.path.extend(['xm-pkg', 'xc-pkg'])
>>>
>>> import demo.foo
>>> import demo.bar
>>> demo

在这里工作的机制被称为命名空间包的一个特征。从本质上讲,命名空间包是一种特殊的封装设计,为合并不同的目录的代码到一个共同的命名空间。

命名空间包的关键是确保顶级目录中没有 __init__.py 文件来作为共同的命名空间。缺失 __init__.py 文件使得在导入包的时候会发生有趣的事情:这并没有产生错误,解释器创建了一个由所有包含匹配包名的目录组成的列表。特殊的包命名空间模块被创建,只读的目录列表副本被存储在其 __path__ 变量中。

>>> demo.__path__
_NamespacePath(['xm-pkg/demo', 'xc-pkg/demo'])

一个包是否被作为一个包命名空间的主要方法是检查其 __file__ 属性。如果没有,那包是个命名空间。这也可以由其字符表现形式中的 namespace 这个词体现出来。

>>> demo

>>>
>>> demo.__file__
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: module 'demo' has no attribute '__file__'

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 结构
    +关注

    关注

    1

    文章

    119

    浏览量

    22017
  • 空间
    +关注

    关注

    2

    文章

    50

    浏览量

    13897
  • python
    +关注

    关注

    56

    文章

    4831

    浏览量

    87496
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    快断式覆成型保险丝 skyworksinc

    电子发烧友网为你提供()快断式覆成型保险丝相关产品参数、数据手册,更有快断式覆成型保险丝的引脚图、接线图、封装手册、中文资料、英文资料,快断式覆成型保险丝真值表,快断式覆成型保
    发表于 07-24 18:34
    快断式<b class='flag-5'>包</b>覆成型保险丝 skyworksinc

    鸿蒙5开发宝藏案例分享---优化应用体积大小问题

    少被讨论。赶紧来跟大家分享一波,附代码详解和实操建议,让你的应用秒瘦身~? ?1. SO库压缩:立竿见影的瘦身术 问题 :SO库(尤其是C++库)占用空间大,默认打包不压缩。优化 **:在 **&
    发表于 06-13 10:09

    蓝牙数据通道空口(数据

    ? 与蓝牙广播相对应,蓝牙数据是另一种Bluetooth LE packet。蓝牙数据是蓝牙数据信道空中的简称,表示空中只在蓝牙数
    发表于 06-03 10:51

    蓝牙广播

    ?蓝牙广播,全名蓝牙广播通道(channel)空中,即在蓝牙广播通道上传输的空中,为两种空中的一种,其具体格式如下所示: ? 编辑 Advertising Header即前述的
    发表于 06-03 10:47

    Bluetooth LE Link Layer数据全解析

    ,因此文章取名“详解Bluetooth LE空口格式—兼Bluetooth LE link layer协议解析”
    发表于 06-03 10:28

    Cadence SPB OrCAD Allegro22.1安装

    Windows 8操作系统,最低需要Windows 10 64位操作系统,如果是Windows Server版需要Windows Server 2012 R2起步。安装后将占用接近20GB的硬盘空间。?版权所有此安装所安装的 Cadence 相关软件版权归属于 Cad
    发表于 05-22 16:50 ?3次下载

    如何将Linux安装快速转成玲珑

    本篇将以 motrix 为例为大家展示如何将 Linux 安装快速转成玲珑
    的头像 发表于 03-12 16:01 ?637次阅读
    如何将Linux安装<b class='flag-5'>包</b>快速转成玲珑<b class='flag-5'>包</b>

    移动电源鼓怎么回事及处理方法

    移动电源(充电宝)鼓是一个值得关注的安全问题,其鼓的原因主要包括以下几点:
    的头像 发表于 01-27 15:41 ?8337次阅读

    I2C总线数据结构详解

    。以下是I2C总线数据结构的详解: 一、I2C总线数据的基本组成 I2C总线上的数据传输以数据为单位进行,每个数据包包含起始信号、设备地址、数据传输方向位、数据字节以及应答信号(
    的头像 发表于 01-17 15:46 ?875次阅读

    华纳云如何解读WinMTR的丢率数据?

    WinMTR显示的丢率数据是指在网络路径上,从你的计算机到目标主机之间,数据丢失的百分比。丢率是网络稳定性的一个重要指标,它可以帮助识别网络中的问题点,如路由器故障、网络拥塞或配置错误。以下
    的头像 发表于 12-30 16:51 ?609次阅读

    mtu配置步骤详解 mtu与数据丢失的关系

    MTU(Maximum Transmission Unit)即最大传输单元,是指一种通信协议的某一层上面所能通过的最大数据报大小,单位是字节。MTU配置步骤及其与数据丢失的关系如下: MTU配置
    的头像 发表于 12-16 14:33 ?2737次阅读

    Linux网卡收流程

    Linux 网卡收流程如下 网卡收到数据 将数据从网卡硬件缓存移动到服务器内存中(DMA方式,不经过CPU) 通过硬中断通知CPU处理 CPU通过软中断通知内核处理 经过TCP/IP协议栈处理
    的头像 发表于 12-05 16:21 ?868次阅读
    Linux网卡收<b class='flag-5'>包</b>流程

    CentOS中使用tcpdump抓

    CentOS中使用tcpdump抓
    的头像 发表于 10-28 14:48 ?780次阅读

    什么是膜压方线?

    而成,工艺过程中新增加了压方工序,使得各股线间隙更小,整线密度更高。 相比于常规线,膜压方线在相同股数下线径可减小50%,可以有效减小磁性元件绕组的体积,为新能源汽车节省更多空间
    的头像 发表于 10-16 11:33 ?860次阅读
    什么是膜<b class='flag-5'>包</b>压方线?

    使用Python进行Ping测试

    )请求,然后等待目标主机返回响应,从而测量网络的延迟和丢情况。随着Python编程语言的广泛应用,越来越多的网络工程师开始使用Python
    的头像 发表于 08-12 17:56 ?1072次阅读
    使用<b class='flag-5'>Python</b>进行Ping测试