目录

  • 目录
  • 模块的搜索路径和路径搜索
    • 搜索路径
  • 命名空间和变量作用域的比较
  • 变量名的查找覆盖
  • 导入模块
    • import 语句
    • from-import 语句
    • 扩展的 import 语句 as
    • 自动载入模块
  • 模块导入的特性
  • 模块内建函数
    • __import__
    • globals locals reload
  • Package 包
    • __init__py
    • import package

模块的搜索路径和路径搜索

搜索路径

默认的模块搜索路径在 Python 解析器编译安装时被指定, 我们可以通过 sys 模块来查看和修改它:

In [4]: sys.path
Out[4]:
['','/usr/bin','/usr/lib/python2.7','/usr/lib/python2.7/plat-x86_64-linux-gnu','/usr/lib/python2.7/lib-tk','/usr/lib/python2.7/lib-old','/usr/lib/python2.7/lib-dynload','/usr/local/lib/python2.7/dist-packages','/opt/stack/keystone','/opt/stack/glance','/opt/stack/cinder','/opt/stack/nova','/opt/stack/horizon','/opt/stack/tempest','/opt/stack/oslo.vmware','/usr/lib/python2.7/dist-packages','/usr/lib/python2.7/dist-packages/IPython/extensions']

存在于搜索路径列表的路径下的模块就可以直接被 import 了.
我们还能够通过 sys.models 可以找到当前导入了那些模块和它来自萨满路径和地方.
NOTE: 这个路径每个人都不尽相同, 在安装 Openstack 项目时, 每一个项目的根目录都会加入到该目录列表中

命名空间和变量作用域的比较

命名空间: 是变量名(标识符)到实际对象的映射, 是一个字典. Python 的命名空间类型有 内建命名空间/全局命名空间/嵌套命名空间/局部命名空间.
Python 解析器启动时, 首先会加载 内建命名空间 , 该空间的变量名映射被包含在 __builtin__ 模块中, 我们可以通过 __builtin__.__dict__ 来查看其包含的变量字典, 主要包含了 ERROR/内建函数 等类型.

注意: __builtin__ 模块和 __builtins__ 模块的名称非常相似, 在标准的 Python 环境中 __builtins__ 含有 __builtin__ 内的所有变量名映射, 却别在于 __builtins__ 是可以被修改的, 用于创建一个 “沙盒” 环境, 但少有人用, 所以两者并不相等.

作用域: 变量名有效的区域定义. 指定了一个变量名在一个指定的区域内有效.

两者的区别: 作用域和命名空间非常相似, 一个作用域的创建伴随着新的命名空间的生成, 其一般是具有对应的关系. 所以往往命名空间中含有的变量名在对应的作用域中都是有效的. 但本质的区别是: 命名空间是纯粹意义上的变量名和对象的映射关系, 而作用域还指出了在代码中的那个物理位置(模块内/类内/函数类)可以访问到命名空间的变量名, 从而得到其映射的对象.

无限制的命名空间: Python 的一个特性在于我们可以动态的为一个函数对象添加变量, 这种变量也称之为实例属性. 所以 Python 的命名空间是无限制的.

In [9]: def func():...:     print "This is a func"...:     In [10]: func.__dict__
Out[10]: {}In [13]: func.name = 'JMilkFan'In [14]: func.__dict__
Out[14]: {'name': 'JMilkFan'}

变量名的查找/覆盖

当我们 call 一个变量名时, Python 解析器的查找顺序如下:
1. 先从局部命名空间开始找, 如果找到了, 则引用变量名映射的对象. 若没有找到, 则进行下一步
2. 到嵌套命名空间找, 如果没有找到, 则进行下一步
3. 到全局命名空间找, 如果没有找到, 则进行下一步
4. 到内置命名空间找, 如果没有找到, 则进入下一步

从这个变量名查找算法可以看出, 当我们在代码物理位置定义了一个变量时, 这个变量就会添加到命名空间中. 而且这个命名空间为变量名的查找提供了清单. 更重要的一点是这个查找算法还有效的覆盖了外层作用域的同名变量. 局部作用域 覆盖 嵌套作用域 覆盖 全局作用域 覆盖 内置作用域.

导入模块

import 语句

import module1[, module2, ..., moduleN]

Python 允许一行导入多个模块, 但那这并不符合 PEP8 的编程标准, 所以建议使用多行导入的方式.

导入模块类型的顺序(中间已单空行隔开):
1. Python 标准库模块
2. Python 第三方模块
3. Python 自定义模块

NOTE: 模块的导入遵循作用域的原则, 在顶格导入的模块, 那么模块的作用域是全局的. 在函数或类内导入的模块, 其作用域就是局部或嵌套作用域.

from-import 语句

如果你希望从一个模块中导入指定属性, 或希望从一个 package 中导入一个模块, 都可以使用 form-import 语句.

from-import 语句也支持一行导入多个模块或属性, EG.

from package import (module1, module2, module3, ..., moduleN)

from-import 语句的好处在于: 针对性的导入可以提高效率和节省空间

NOTE: 我们一般建议导入到模块即可, 非特殊情况不要导入包或模块内的属性

扩展的 import 语句 as

也称之为别名, 模块之间也会经常出现同名的情况, 如果出现同一个模块中导入了两个或多个同名模块的情况, 那么应该为每个相同的模块取一个别名来有效区分. 除此之外, 如果模块的全称过长, 我们也可以为其取一个短小的别名. EG.

import module1 as module_onefrom package import module1 as module_twoimport Tkinter as tk

自动载入模块

Python 解析器在标准模式下启动会自动的导入一个模块, 例如 __bulitin__. 我们可以通过 sys.modules 来查看已经被导入到当前环境下模块字典, key 为模块名, value 为模块路径.

import sys
sys.modules.keys()

模块导入的特性

  • 加载模块时执行文件
    在导入模块时, 其顶格的代码(全局变量/类定义/函数定义…)会被执行, 所以不建议写太多的顶格代码, 应尽量多的将顶格代码收入函数或类体内.

  • 导入和加载模块是不一样的
    一个模块可以被导入多次, 但正常情况下只能被加载一次. 当然除了手动加载之外. EG: 你需要在一个模块中导入 5 个模块, 其中之一为 sys 模块, 然后另外的 4 个模块也需要导入 sys 模块, 这种情况下, sys 模块只会被加载一次, 但却会被导入 5 次.

  • 导入到当前命名空间的变量
    通过 from-import 导入到当前命名空间的模块变量是不需要通过句点标识符来调用的, 直接就可以引用. 但是不建议通过 from-import 来直接导入模块变量, 这样容易污染当前的命名空间, 可能导致覆盖一个已经存在的具有相同名字的对象.

模块内建函数

__import__()

格式:

__import__(module_name[, globals[, locals[, fromlist]]])
# globals 是全局命名空间的字典 ⇒ globals()
# locals 是局部命名空间的字典 ⇒ locals()
# fromlist 是 from-import 语句导入的变量名的列表 ⇒ []

当我们执行 import 语句的时候, 实际上是调用了 __import__() 内置函数, EG:

import sys
# 等效于
sys = __import__('sys')

globals() / locals() / reload()

  • globals(): 返回调用者的全局命名空间的字典
  • locals(): 返回调用者的局部命名空间的字典
    NOTE: 如果在全局命名空间调用上面两个内置函数, 那么两者返回的字典是相同的

  • reload(): 重新导入一个已经被导入了的模块
    NOTE: reload() 由两个使用限制

    1. 模块必须全部被导入, 不能重载通过 from-import 来导入模块属性的模块
    2. 该模块必须是已经被导入了的, 才能被重载
      模块的顶格代码在导入的时候会执行且仅执行一次, 再次导入的时候不会被执行, 如果希望再次执行的话, 可以使用 reload()

Package 包

模块是代码的组织形式, 包是模块的组织形式. 如果在一个目录中创建了 __init__.py 文件, 那么 Python 解析器会将该目录标识为一个包 Package.
NOTE: 我们一般在使用 import 语句的时候, 建议导入到模块级别, 不要导入模块属性, 也不要导入包.

__init__.py

__init__.py 文件是包的标识文件, 作为包的初始化模块, from-import 包下的模块会子包时, 需要用到该初始化模块, 所以现在如果一个包中没有该模块时, 会触发 ImportWarning 信息.

import package

如果我们不需要使用初始化模块__init__.py时. 该模块的内容为空, 如果我们需要使用该模块时, import packageName == import packageName._init_.
而且需要注意的是: 如果我们执行 from package import * 时, 会将该包下的所有模块和属性导入, 实际上这种做法是不科学的. 所以在包的初始化模块文件中有一个特殊属性 __all__ , __all__ 属性由一个模块名字组成的列表组成, 这个列表中包含了所有在执行全导入时应该被导入的模块和属性的名字.

Python 进阶_模块 amp; 包相关推荐

  1. Python 进阶_模块 包

    目录 文章目录 目录 模块的搜索路径和路径搜索 命名空间和变量作用域的比较 变量名的查找/覆盖 导入模块 import 语句 from-import 语句 扩展的 import 语句 as 自动载入模 ...

  2. Python进阶----pymysql模块的使用,单表查询

    Python进阶----pymysql模块的使用,单表查询 一丶使用pymysql ​   ​   1.下载pymysql包: pip3 install pymysql ​​   ​   2.编写代码 ...

  3. python之路——模块和包

    一.模块 1.什么是模块? 常见的场景:一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1.使用Python编 ...

  4. Python 中的模块和包

    原文引至:前端小吉米 对于python中的模块和包, 我简直就想说, js nmlgb 就是一个 trash... 在前端写js根本就没有什么模块和包, 全部都是全局... 真lj... 畅快了. 写 ...

  5. 自学Python第九天- 模块、包、编码、文件操作、OS 模块、打包

    自学Python第九天- 模块.包.编码.文件操作.OS 模块.打包 模块 导入模块 程序入口 包 编码 文件操作 打开或创建文件 常用的文件打开模式 边读边写 文件对象的常用方法 读写 CSV Ex ...

  6. Python盒子:模块、包和程序

    Python盒子:模块.包和程序 命令行参数 test2.py import sys print('Program arguments:', sys.argv) D:\MyPython>pyth ...

  7. Python 进阶_生成器 生成器表达式

    目录 目录 相关知识点 生成器 生成器 fab 的执行过程 生成器和迭代器的区别 生成器的优势 加强的生成器特性 生成器表达式 生成器表达式样例 小结 相关知识点 Python 进阶_迭代器 & ...

  8. python哪里下载import包-详解python中的模块及包导入

    python中的导入关键字:import 以及from import 1.import import一般用于导入包以及模块. 不过有个小问题: (1)当导入的是模块的时候是可以直接可以使用模块内的函数 ...

  9. Python基础之模块和包

    Python基础之模块和包 本节将介绍Python中的模块和包的概念及基本用法. 模块 简单来说模块就是一个python文件,我们可以将一些常量.函数.类等封装到一个模块中,然后在程序中使用该模块.模 ...

最新文章

  1. CentOS 7 上安装 redis3.2.3安装与配置
  2. 子数整数(luogu 1151)
  3. 【错误记录】 ERROR java.lang.NoClassDefFoundError
  4. 附加一个:为什么要用简单工厂模式
  5. sublime html文件中php代码,sublime - 嵌套在html里面的php代码该遵循怎样的规范
  6. React Native填坑之旅--动画
  7. 浅谈股价预测模型:全能大明星——神经网络模型
  8. 驱动人生安装win11苹果/Windows系统教程
  9. 「Head First」编程系列丛书
  10. 微信小程序常用路由跳转方法
  11. 马科维茨投资组合理论总结
  12. 运动模糊图像复原算法实现及应用
  13. IM 朋友圈后台存储设计
  14. MacOS开发-用命令行压缩文件
  15. matlab set函数
  16. 推荐三款换装变脸软件给你
  17. 蓝桥杯省赛真题2014题解
  18. 网站图标的生成和使用--web前端
  19. 光栅原理及其c语言仿真,取样光栅原理及MATLAB仿真.doc
  20. 高校新闻抓取分析之百度新闻篇---数据清洗解析

热门文章

  1. php网站404页面302,404页面该怎么做?
  2. c++-内存管理-内存对齐方式
  3. 5.8.1 创建类型实例
  4. WCF 调用webservice
  5. 在ArcGIS调坐标系引发的一系列问题
  6. 小试牛刀JavaScript鼠标事件
  7. Review on Optical Flow Research
  8. HlpViewer.exe 单独打开
  9. mybatis 模糊查询
  10. 如何对PHP程序中的常见漏洞进行攻击(上)