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

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

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

    关注

    4

    文章

    1010

    浏览量

    122581
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28300
  • python
    +关注

    关注

    54

    文章

    4763

    浏览量

    84338
收藏 人收藏

    评论

    相关推荐

    模拟电子技术知识点问题总结概览

    给大家分享模拟电子技术知识点问题总结。
    的头像 发表于 05-08 15:16 1058次阅读
    模拟电子技术<b class='flag-5'>知识点</b>问题总结概览

    一篇搞定DCS系统相关知识点

    目标。DCS系统广泛应用于各个行业,如化工、电力、制药等。在这些行业中,DCS系统可以实现对生产过程的集中监控和分散控制,提高生产效率和产品质量,降低能耗和减少环境污染,从而保证产品质量,并确保生产过程的安全可靠。 二.DCS系统知识点
    的头像 发表于 03-26 18:40 751次阅读
    一篇搞定DCS系统相关<b class='flag-5'>知识点</b>

    浅谈初级电工必备知识点

    对于初学电工的朋友来说,掌握一些基础且实用的知识点是非常重要的。本文旨在分享初级电工应该掌握的核心知识,帮助新手电工更好地入门和提升技能。
    的头像 发表于 12-26 10:44 980次阅读

    TCP协议面试常问知识点总结

    TCP 作为传输层的协议,是一IT工程师素养的体现,也是面试中经常被问到的知识点。在此,我将 TCP 核心的一些问题梳理了一下,希望能帮到各位。
    的头像 发表于 12-15 10:38 733次阅读
    TCP协议面试常问<b class='flag-5'>知识点</b>总结

    开关模式下的电源电流如何检测?这12电路&amp;10知识点讲明白了

    开关模式下的电源电流如何检测?这12电路&10知识点讲明白了
    的头像 发表于 12-06 16:04 732次阅读
    开关模式下的电源电流如何检测?这12<b class='flag-5'>个</b>电路&amp;10<b class='flag-5'>个</b><b class='flag-5'>知识点</b>讲明白了

    c语言程序设计基础知识点

    程序设计的基础知识点。 首先,我们将从C语言的数据类型和变量开始。C语言提供了多种数据类型,包括整数、浮点数、字符和指针等。整数类型包括int、long和short等,浮点数类型包括float和double等,字符类型用于存储ASCII字符,指针类型用
    的头像 发表于 11-27 15:25 1538次阅读

    数字电位计知识点

    电子发烧友网站提供《数字电位计知识点.pdf》资料免费下载
    发表于 11-24 16:08 7次下载
    数字电位计<b class='flag-5'>知识点</b>

    python嵌入和安装程序的区别

    中。 在Python中,有两种常见的方式来引入和使用第方扩展功能,即嵌入和安装程序。本文将详细介绍这两种方式的区别,以及何时应该选择使用哪种方式。 一、嵌入 概述 嵌入
    的头像 发表于 11-23 16:42 8594次阅读

    如何用import导入

    Python中,import语句用于导入代码所需的模块或。模块是Python代码的集合,而是包含模块和其他
    的头像 发表于 11-22 14:59 1041次阅读

    Python怎么导入math模板

    Python中使用math模块需要先导入该模块。math模块提供了许多数学函数和数值常量,可以在数学计算和统计分析等方面派上用场。下面将详细介绍如何导入math模块以及如何使用它的各种功能。 要使
    的头像 发表于 11-22 14:49 2105次阅读

    python如何导入模块

    。本文将详细介绍Python中模块导入的相关知识,并举例演示常见的导入方式和用法。 首先,我们需要明确一些基本的概念。Python 的模块可
    的头像 发表于 11-22 14:46 862次阅读

    python中if三个条件怎么写

    Python 中,使用 if 语句可以根据给定条件的真假来决定程序的执行路径。通常情况下,if 语句有一条件,并根据这个条件来判断是否执行某段代码。然而,在某些情况下,我们需要根据多个条件来
    的头像 发表于 11-21 16:42 1242次阅读

    菱和西门子PLC输入接线知识点

    菱和西门子PLC输入接线知识点
    的头像 发表于 11-21 10:01 684次阅读
    <b class='flag-5'>三</b>菱和西门子PLC输入接线<b class='flag-5'>知识点</b>

    OFDM技术知识点

    电子发烧友网站提供《OFDM技术知识点.rar》资料免费下载
    发表于 11-18 14:25 1次下载
    OFDM技术<b class='flag-5'>知识点</b>

    TCP次握手的理论知识

    关于TCP次握手的理论知识,往上一搜一大片,本文就跳过理论,直接上手。Let’s go。 准备知识 抓一TCP
    的头像 发表于 11-09 11:27 727次阅读
    TCP<b class='flag-5'>三</b>次握手的理论<b class='flag-5'>知识</b>