zoukankan      html  css  js  c++  java
  • python死磕六之模块与包

      这篇还是总结一下自己关于模块与包有遗漏或者不知道的地方,学习路上,还需共勉。

      一、 控制模块被全部导入的内容

      当我们使用import * 时,会导入模块内所有元素,那么怎么才能控制import * 的内容呢?

      遗漏点:在你的模块中定义一个变量 __all__ 来明确地列出需要导出的内容。

       

    def spam():
        pass
    
    def grok():
        pass
    
    blah = 42
    # Only export 'spam' and 'grok'
    __all__ = ['spam', 'grok']

      这样我们在导入的时候,只会导入__all__所包含的模块。

      二、你可能有大量的代码,由不同的人来分散地维护。每个部分被组织为文件目录,如一个包。然而,你希望能用共同的包前缀将所有组件连接起来,不是将每一个部分作为独立的包来安装。

      假设你有Python代码的两个不同的目录如下:

    foo-package/
        spam/
            blah.py
    
    bar-package/
        spam/
            grok.py

      在这2个目录里,都有着共同的命名空间spam。在任何一个目录里都没有__init__.py文件。

    >>> import sys
    >>> sys.path.extend(['foo-package', 'bar-package'])
    >>> import spam.blah
    >>> import spam.grok

      三、你想导入一个模块,但是模块的名字在字符串里。你想对字符串调用导入命令。

    >>> import importlib
    >>> math = importlib.import_module('math')
    >>> math.sin(2)
    0.9092974268256817
    >>> mod = importlib.import_module('urllib.request')
    >>> u = mod.urlopen('http://www.python.org')

      import_module只是简单地执行和import相同的步骤,但是返回生成的模块对象。你只需要将其存储在一个变量,然后像正常的模块一样使用。

      如果你正在使用的包,import_module()也可用于相对导入。但是,你需要给它一个额外的参数。例如:

    import importlib
    # Same as 'from . import b'
    b = importlib.import_module('.b', __package__)
  • 相关阅读:
    Windows网络编程经验小结
    异步Socket服务器与客户端
    用C#实现C/S模式下软件自动在线升级
    Linux 安装字体
    word 生成目录
    Linux sar使用
    yum 使用说明
    HASH JOIN算法
    row cache lock
    cursor: pin S
  • 原文地址:https://www.cnblogs.com/jimmyhe/p/10821513.html
Copyright © 2011-2022 走看看