cookbook_模块和包

1把模块按层次结构组织成包

只需确保每个目录中都定义了__init__.py即可。

2对所有符号的导入进行精确控制

当用户使用from module import * 语句时,我们希望对从模块或包中导入的符号进行精确控制。

在模块中定义一个变量__all__,用来显示列出可导出的符号名。

__all__ = ["spam","grok"]

 

3使用相对名称来导入包中的子模块

mypackage/
  __init__.py
  A/
    __init__.py
    spam.py
    grok.py
  B/
    __init__.py
    bar.py
    
 #spam.py
 from . import grok
 from ..B import bar

使用该方法来导入包内模块,可以很好的减少硬编码导入模块,如果使用绝对名称导入,如果最顶端的文件名变化所有的导入都将出现问题。

ps.

执行脚本出现导入错误时  python3 -m mypackage

 

4将模块分解成多个文件

在不破坏使用结构的情况下,将一个模块分解成多个模块

首先将模块变成包,在包内__init__.py文件内将子模块导入。

 

5让各个目录下的代码在统一的命名空间下导入

foo_package/
  spam/
    blah.py
bar_package/
  spam/
    grok.py
    
import sys
sys.path.extend(["foo_package","bar_package"])
import spam.blah
import spam.grok

在这两个目录中 spam作为公共的命名空间,注意这两个目录中都没有__init__.py文件。

 

6重新加载模块

开发环境中使用,尽量不在生产环境使用

import imp
import math
imp.reload(math)

 

7让目录或zip文件成为可运行的脚本

myapplication/
  spam.py
  bar.py
  grok.py
  __main__.py
  
  python myapplication
  
  如果包含__main__.py文件,就可以当作脚本来运行,会运行__main__.py里的方法

 

8读取包中的数据文件

mypackage/
  __init__.py
  somedata.dat
  spam.py
  
import pkgutil
data = pkgutil.get_data(__package__,"somedata.dat")

# data会得到一个字节串

9添加目录到sys.path中

三种解决方案,第一种是使用PYTHONPATH环境变量来添加。

env PYTHONPATH = /some/dir:/other/dir python3

 

第二种是通过创建.pth文件,将.pth文件放在python的site_packages

#mtapplication
/some/dir
/other/dir

第三种是硬编码到代码中

import sys
sys.path.insert(0,"/some/dir")
sys.path.insert(0,"/other/dir")

 

10使用字符串中给定的名称来导入模块

import importlib
math = importlib.import_module("math")

 

posted @ 2019-07-28 17:54  克里夫妇  阅读(173)  评论(0编辑  收藏  举报