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__)
  • 相关阅读:
    poj 3321 Apple Tree
    hdu 1520 Anniversary party
    Light OJ 1089 Points in Segments (II)
    Timus 1018 Binary Apple Tree
    zoj 3299 Fall the Brick
    HFUT 1287 法默尔的农场
    Codeforces 159C String Manipulation 1.0
    GraphQL + React Apollo + React Hook 大型项目实战(32 个视频)
    使用 TypeScript & mocha & chai 写测试代码实战(17 个视频)
    GraphQL + React Apollo + React Hook + Express + Mongodb 大型前后端分离项目实战之后端(19 个视频)
  • 原文地址:https://www.cnblogs.com/jimmyhe/p/10821513.html
Copyright © 2011-2022 走看看