【问题标题】:Python modules with submodules and functions带有子模块和函数的 Python 模块
【发布时间】:2022-01-15 00:40:49
【问题描述】:

我对@9​​87654321@ 之类的库如何工作有疑问。当我导入numpy 时,我可以访问大量内置类、函数和常量,例如numpy.arraynumpy.sqrt 等。

但在 numpy 中还有额外的子模块,例如 numpy.testing

这是怎么做到的?在我有限的经验中,带有子模块的模块只是带有 __init__.py 文件的文件夹,而带有函数/类的模块是实际的 python 文件。如何创建一个同时具有函数/类的模块“文件夹”?

【问题讨论】:

    标签: python function module


    【解决方案1】:

    包含.py 文件和__init__.py 的文件夹称为package。其中一个包含类和函数的文件是module。文件夹嵌套可以给你子包。

    例如,如果我有以下结构:

      mypackage
         __init__.py
         module_a.py
         module_b.py
            mysubpackage
                 __init__.py
                 module_c.py
                 module_d.py
    

    我可以导入mypackage.module_amypackage.mysubpackage.module_c 等等。

    您还可以通过将该代码放在__init__.py 中来向mypackage 添加函数(如您提到的numpy 函数)。虽然这通常被认为是丑陋的。

    如果您查看numpy's __init__.py ,您会看到其中有很多代码——其中很多是定义这些顶级类和函数。 __init__.py 代码是加载包时首先执行的代码。

    【讨论】:

    • 那么如何导入像 numpy 或 scipy 这样的库,并且包含类/函数(如模块)和其他模块(如包)。所以我可以做 numpy.array(一个类)或 numpy.testing.assert...(获取一个模块)。
    • 我刚刚回答过,都在__init__.py 中。解释器加载时,其中的任何函数都将是包的一等成员。
    • 啊,这就是我想知道的。我认为它会被认为是丑陋的,因为有很多杂项。逻辑会进入其中。我认为所有内容都是单独编码的,然后以某种方式全部合并到 init.py 中?拥有这样的东西似乎很有用,但我不确定如何在不将大量代码转储到一个文件中的情况下复制它。
    • @ImpGuard 在__init__.py 中,您可以导入任何您想要的文件/类/函数。在numpy/scipy 案例中,他们决定在那里提供最常用的功能。 然而,这意味着在导入numpy 时,它的很多子模块必须被导入,这需要很长时间。我个人更喜欢避免导入__init__.py 中的所有内容。我通常有一个 all.py 子模块可以做到这一点,所以如果你想要所有你可以做的事情 import X.all as X,否则你可以选择导入什么。
    • 啊,我明白了!因此,如果我在 init.py 文件中导入某些内容,这些项目也将成为包的第一类成员!但是,请务必明确,这确实意味着如果我将我的类分成单独的文件(以便更有条理)并在加载包时将它们全部导入,我仍然在技术上将这些文件作为“隐藏”的模块?这意味着如果将制作 numpy 的人组织起来并将 np.matrix 放在 numpy 下的某个子模块中,并在导入 numpy 时简单地导入它,则可能存在一些我不知道的隐藏 numpy.__matrix 模块。
    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多