<< >>

diveintopython.org |

Python for experienced programmers

## 2.2. 使用 `from module import` 导入模块

Python有两种导入模块的方法。两种都有用，你应该知道什么时候使用哪一种方法。一种方法， `import module`，你已经在第一章看过了。另一种方法完成同样的事情，但是它以细微但重要的不同方式工作。

例 2.4. 基本的 `from module import` 语法

    from types import BuiltinFunctionType, BuiltinMethodType, \
        FunctionType, MethodType, ClassType

这种语法与你所知的 `import module` 语法类似，但是有一个重要的区别：导入模块 `types` 的属性和方法被直接导入到局部名字空间中，所以这些属性和方法是直接有效的，不需要通过模块名来限定。

例 2.5. `import module` 对比 `from module import`

    >>> import types
    >>> types.FunctionType
    <type 'function'>
    >>> FunctionType
    Traceback (innermost last):
      File "<interactive input>", line 1, in ?
    NameError: There is no variable named 'FunctionType'
    >>> from types import FunctionType
    >>> FunctionType
    <type 'function'>

| `types` 模块不包含方法，只有每个Python对象类型的属性。注意， `FunctionType` 属性必需用 `types` 模块名进行限定。
| `FunctionType` 本身没有被定义在当前名字空间中；它只存在于 `types` 的上下文环境中。
| 这个语法直接从 `types` 模块中导入 `FunctionType` 属性到局部名字空间。
| 现在 `FunctionType` 可以直接存取，不需要引用 `types`。

什么时候你应该使用 `from module import`？

- 如果你要经常存取模块的属性和方法，且不想一遍遍地敲入模块名，使用 `from module import`。
- 如果你想要有选择地导入某些属性和方法，而不想要其它的，使用 `from module import`。
- 如果模块包含的属性和方法与你的某个模块同名，你必须使用 `import module` 来避免名字冲突。

另外，它只是风格问题，你会看到用两种方式编写的Python代码。

进一步阅读 |

- eff-bot 有更多的论述关于 `import module` 对比 `from module import`.
- Python Tutorial 讨论了高级导入技术，包括 `from module import *`.

« 自省的威力 | 可选和定名参数 »