Python: 深入Python模块的使用

python scott 189℃ 0评论

1. 模块的导入

import file_name可以导入当前目录上file_name.py这个模块,但是里面的内容,必须通过file_name.func/file_name.var 来访问。

另外一种导入方式为 import func/var from file_name。这样func/var直接可用,但是file_name是没有定义的。

从file_name中导入所有: import * from file_name。这样会导入所有除了以下划线开头的命名。实际代码中这样做往往是不被鼓励的。

如果你一直在某个环境,比如解释器下面,你已经导入过某个模块 ,现在你对模块进行了修改,这里你需要用reload(modulename)来重新载入。

模块中的主函数:

1
2
3
if __name__ == "__main__>":
    import sys
    fib(int(sys.argv[1]))

2. 模块的搜索路径

首先会搜索解析器的当前目录。然后会到sys.path变量中给出的目录列表中查找。

1
2
3
>>> import sys
>>> sys.path
['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
  1. 输入脚 本的目录(当前目录)
  2. 环境变量 PYTHONPATH表示的目录列表中搜索
  3. Ptyon的默认安装路径中搜索。

3. 内置模块

dir()函数返回模块内的所有定义,无参数时, dir()返回当前解释器中定义的命名。

1
2
3
4
5
>>> import fibo
>>> dir(fibo)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'fib', 'fib2']
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'fibo']

dir()并不会列出内置函数和变量名。如果你想列出这些内容,它们在标准模块 __builtin__中定义。

4. 包

当不同作的模块进行按文件夹分类后再组成一个整体的库,可以称为包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
sound/            Top-level package
__init__.py        Initialize the sound package
formats/          Subpackage for file format conversions
    __init__.py
    wavread.py
    wavwrite.py
    aiffread.py
    aiffwrite.py
    auread.py
    auwrite.py
    ...
effects/          Subpackage for sound effects
    __init__.py
    echo.py
    surround.py
    reverse.py
    ...
filters/          Subpackage for filters
    __init__.py
    equalizer.py
    vocoder.py
    karaoke.py
    ...

为了让Python将目录当做内容包,目录中必须包含 __init__.py文件。最简单的情况下,只需要一个空的 __init__.py文件即可。

包有两种导入模块或模块内函数的/变量的方式:

1
2
from package import item  # 这种方式,item可以是包中的一个子模块或子包,也可以是包中定义的其他命名,像函数、类、变量。
import item.subitem.subsubitem # 这些子项必须是包,最后的子项是包或模块。但不能为函数、类或变量。

5. 从 * 导入包

那么当用户写下 from sound.Effects import *时会发生什么事?理想中,总是希望在文件系统中找出包中所有的子模块,然后导入它们。这可能会花掉委有长时间,并且出现期待之外的边界效应,导出了希望只能显式导入的包。

对于包的作者来说唯一的解决方案就是给提供一个明确的包索引。import 语句按如下条件进行转换:执行 from package import *时,如果包中的 __init__.py代码定义了一个名为 __all__的列表,就会按照列表中给出的模块名进行导入。新版本的包发布时作者可以任意更新这个列表。如果包作者不想 import * 的时候导入他们的包中所有模块,那么也可能会决定不支持它( import * )。例如, sounds/effects/__init__.py这个文件可能包括如下代码:

1
__all__ = ["echo>", "surround>", "reverse>"]

这意味着 from Sound.Effects import *语句会从 sound 包中导入以上三个已命名的子模块。

如果没有定义 __all__from Sound.Effects import *语句 不会 从 sound.effects 包中导入所有的子模块。无论包中定义多少命名,只能确定的是导入了 sound.effects 包(可能会运行 __init__.py中的初始化代码)以及包中定义的所有命名会随之导入。这样就从 __init__.py中导入了每一个命名(以及明确导入的子模块)。同样也包括了前述的 import 语句从包中明确导入的子模块,考虑以下代码:

1
2
3
import sound.effects.echo
import sound.effects.surround
from sound.effects import *

在这个例子中,echo 和 surround 模块导入了当前的命名空间,这是因为执行 from…import 语句时它们已经定义在 sound.effects 包中了(定义了 __all__时也会同样工作)。

尽管某些模块设计为使用 import * 时它只导出符全某种模式的命名,仍然不建议在生产代码中使用这种写法。

记住,from Package import specific_submodule 没有错误!事实上,除非导入的模块需要使用其它包中的同名子模块,否则这是推荐的写法。

原文:http://www.cnblogs.com/ronny/p/4519516.html

转载请注明:osetc.com » Python: 深入Python模块的使用

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址