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

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

3天内不再提示

关于python包导入的三个冷门知识点

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

扫码添加小助手

加入工程师交流群

1. 使用 __all__ 控制可被导入的变量

使用 from module import * 默认情况下会导入 module 里的所有变量,若你只想从模块中导入其中几个变量,可以在 module 中使用 __all__ 来控制想要被其他模块导入的变量。

# profile.py
name='小明'
age=18

__all__=['name']

打开 python console 验证一下

>>> from profile import *
>>> print(name)
小明
>>> print(age)
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'age' is not defined

__all__ 仅对于使用from module import * 这种情况适用。

它经常在一个包的 __init__.py 中出现。

2. 命名空间包的神奇之处

命名空间包,一个陌生的名字。

与我们熟悉的常规包不同的是,它没有 __init__.py 文件。

更为特殊的是,它可以跨空间地将两个不相邻的子包,合并成一个虚拟机的包,我们将其称之为 命名空间包

例如,一个项目的部分代码布局如下

foo-package/
    spam/
        blah.py

bar-package/
    spam/
        grok.py

在这2个目录里,都有着共同的命名空间spam。在任何一个目录里都没有__init__.py文件。

让我们看看,如果将foo-package和bar-package都加到python模块路径并尝试导入会发生什么?

>>> import sys
>>> sys.path.extend(['foo-package', 'bar-package'])
>>> import spam.blah
>>> import spam.grok

当一个包为命名空间包时,他就不再和常规包一样具有 __file_ 属性,取而代之的是 __path__

>>> import sys
>>> sys.path.extend(['foo-package', 'bar-package'])
>>> import spam.blah
>>> import spam.grok
>>> spam.__path__
_NamespacePath(['foo-package/spam', 'bar-package/spam'])
>>> spam.__file__
Traceback (most recent call last):
    File "", line 1, in 
AttributeError: 'module' object has no attribute '__file__'

3. 模块重载中的一个坑

由于有 sys.modules 的存在,当你导入一个已导入的模块时,实际上是没有效果的。

为了达到模块的重载,有的人会将已导入的包从 sys.modules 中移除后再导入

就像下面这样子

>>> import foo.bar
successful to be imported
>>>
>>> import foo.bar
>>>
>>> import sys
>>> sys.modules['foo.bar']

>>> del sys.modules['foo.bar']
>>>
>>> import foo.bar
successful to be imported

上面的例子里我使用的是import foo.bar ,如果你使用的是 from foo import bar 这种导入形式,会发现重载是同样是无效的。

这应该算是一个小坑,不知道的人,会掉入坑中爬不出来。

>>> import foo.bar
successful to be imported
>>>
>>> import foo.bar
>>>
>>> import sys
>>> del sys.modules['foo.bar']
>>> from foo import bar

因此,在生产环境中可能需要避免重新加载模块。而在调试模式中,它会提供一定的便利,但你要知道这个重载的弊端,以免掉入坑里。
审核编辑:汤梓红

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

    关注

    5

    文章

    1035

    浏览量

    125837
  • 变量
    +关注

    关注

    0

    文章

    616

    浏览量

    29566
  • python
    +关注

    关注

    58

    文章

    4884

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    示波器小知识点

    示波器的系统带宽:是指一逐渐升高频率的正弦输入信号显示幅度下降3dB时的频率。测试信号一般是方波,而方波信号由基波及奇次谐波组成。如果用示波器去测一方波,需要注意示波器应从频率上能够测量到它
    的头像 发表于 04-16 11:04 74次阅读
    示波器小<b class='flag-5'>知识点</b>

    【黑金云课堂笔记】第知识点总结

    ,对 FPGA 免费直播课的热情也感染到了黑金云课堂的老师们。接下来我们会再接再厉,把每一期直播都做得更扎实   更多精彩课程欢迎关注我们 黑金云课堂全年免费直播课 ,现在让我们先来回顾一下上周的知识点精华——   数据类型 常量 进制表示:二进制(b/B)、八进制(o/
    的头像 发表于 04-01 16:08 171次阅读
    【黑金云课堂笔记】第<b class='flag-5'>三</b>期<b class='flag-5'>知识点</b>总结

    如何在 VisionFive 上使用 Python

    来安装 愿景五.gpio 软件: sudo pip install 愿景五.gpio或者,您可以执行以下命令: sudo pip3 install 愿景五.gpio (可选)如果将源代码复制到
    发表于 03-30 08:28

    altium designer 如何画短路两或者三个网络的封装?

    如何我画了一天线,有3引脚,TX1,TX2,GND, 但实际上这三个引脚是连在一起的。我导入pcb后,会报DRC警告,这个该怎么解决?
    发表于 02-12 19:30

    详解网络丢故障排查过程

    干运维这么多年,见过各种各样的故障,但有些问题真的是让人抓狂。前段时间遇到的一MTU问题,差点让我怀疑人生。表面上看是简单的丢,实际上折腾了整整两天才定位到根因。今天就把这个案例完整地记录下来,顺便把MTU相关的知识点系统地
    的头像 发表于 01-26 15:21 990次阅读

    三个经典开关电源实际问题解析

    下面三个关于多路输出电源连续工作模式的问题,测试一下您的电源设计知识。然后核对您的答案。
    的头像 发表于 01-22 16:08 3406次阅读
    <b class='flag-5'>三个</b>经典开关电源实际问题解析

    从“能用”到“懂原理”:ARMv8寄存器架构深度拆解

    、ELR这些寄存器,只知道是保存状态的,却搞不清背后的设计逻辑; 其实ARMv8的寄存器架构,不是“零散知识点的堆砌”,而是围绕“高效运算”“安全隔离”“状态可控”三个核心目标设计的完整体系。 今天这篇文章,我不做枯燥的知识点
    的头像 发表于 01-10 07:10 297次阅读
    从“能用”到“懂原理”:ARMv8寄存器架构深度拆解

    防漆知识百科:防漆是什么?核心价值有哪些?

    、航空航天等18大行业,2024年国内市场规模已突破48亿元,其中汽车电子、工业控制领域需求同比激增32%。本文以知识百科形式,全面拆解防漆的核心知识点,助力行
    的头像 发表于 12-27 17:38 700次阅读
    <b class='flag-5'>三</b>防漆<b class='flag-5'>知识</b>百科:<b class='flag-5'>三</b>防漆是什么?核心价值有哪些?

    未来工业AI发展的三个必然阶段

    与优化 能力的深层革命。 未来十年,工业AI的发展将经历三个清晰的阶段:  智能辅助 → 智能决策 → 自主优化 。这次进化,构成了工业从“人控机器”到“机器共智”的核心路径。 一、第一阶段:智能辅助(AI for Assistance) 时间窗口:
    的头像 发表于 10-27 15:47 589次阅读
    未来工业AI发展的<b class='flag-5'>三个</b>必然阶段

    Pico Technology发布Python软件pyPicoSDK

    近日,全球领先的基于 PC 的仪器供应商Pico Technology 官方发布了 pyPicoSDK,这是一款旨在简化 PicoScopes 应用的 Python 软件。pyPicoSDK 在
    的头像 发表于 09-29 15:03 1096次阅读

    10亿大单落定!三个均第一,昆仑芯中标中移动集采项目

    含税价超17亿元;标5和标6为CANN生态设备,总含税价约34亿元。 前四由中兴通讯、新华、浪潮等
    发表于 08-23 00:30 3586次阅读

    突破LuatOS开发瓶颈:三个二次开发必备知识揭秘!

    遇到LuatOS开发难题?或许你忽略了这三个关键常识。它们看似简单,却能破解资源管理、效率提升等瓶颈问题,为你的项目注入新活力,实现技术跃迁。 本期一起来了解LuatOS开发需要熟悉的几个常识
    的头像 发表于 06-23 15:05 510次阅读
    突破LuatOS开发瓶颈:<b class='flag-5'>三个</b>二次开发必备<b class='flag-5'>知识</b>揭秘!

    C51单片机及C语言知识点必备秘籍

    单片机关键知识点一览: 系列一 1:单片机简叙 2:单片机引脚介绍 3:单片机存储器结构 4:第一单片机小程序 5:单片机延时程序分析 6:单片机并行口结构 7:单片机的特殊
    发表于 05-15 14:00

    电机选型计算公式与知识点汇总

    纯分享帖,需要者可点击附件获取完整资料~~~*附件:电机选型计算公式与知识点汇总.pdf 【免责声明】内容转自今日电机,因转载众多,无法确认真正原始作者,故仅标明转载来源。版权归原出处所有,纯分享帖,侵权请联系删除内容以保证您的权益。
    发表于 04-29 16:10

    模拟电路入门100知识点

    0.7V。 13、频率响应是指在输入正弦信号的情况下,输出随频率连续变化的稳态响应。 15、N型半导体中的多数载流子是电子,少数载流子是空穴。 16、按一周期内一只极管的导通角区分,功率放大电路
    发表于 04-25 15:51