gpt4 book ai didi

具有从子模块导入到根命名空间的方法的 Python 模块

转载 作者:太空狗 更新时间:2023-10-30 00:56:43 27 4
gpt4 key购买 nike

我想创建一个像 NumPy 一样工作的 Python 模块。这些方法不仅是来自模块源的树叶中的子模块。有一个根模块包含很多我可以直接调用的方法,还有子模块。问题是必须在某处定义根方法。我想有一个目录结构:

module/
__init__.py
core.py
stuff1.py
submodule/
__init__.py
stuff2.py
stuff3.py

现在我想要的是将“core”中的所有内容都导入到“module”命名空间中,就好像它是一个 module.py 文件,并且 core.py 的内容在这个 module.py 中。问题是模块是一个目录而不是一个文件,那么我该如何定义这些应该位于模块根目录中的方法呢?

我尝试将“from core import *”放在init.py 中,但这没有用。 (编辑:实际上是这样。)

我应该在“module.py”文件和模块目录中包含核心方法吗?我不知道这是否可行,但它看起来很尴尬。

最佳答案

我想你想要的是能够做到这一点:

# some_other_script.py

import module
# Do things using routines defined in module.core

当您要求 Python import module 时会发生什么(在非常基本意义上),module/__init__.py 运行,并创建一个 module 对象并将其导入到您的命名空间中。该对象(同样,非常基本)包含运行 __init__.py 时发生的事情:名称定义等。这些可以通过 module.something 访问。

现在,如果您的设置如下所示:

# module/__init__.py

from module.core import Clazz
c = Clazz()
print c # Note: demo only! Module-level side-effects are usually a bad idea!

当您导入模块时,您会看到如下打印语句:

<module.core.Clazz object at 0x00BBAA90>

太棒了。但是,如果您随后尝试访问 c,您将得到一个 NameError:

# some_other_script.py
import module # prints "<module.core.Clazz object at 0x00BBAA90>"
print c # NameError (c is not defined)

这是因为你还没有导入c;你已经导入了模块。相反,如果您的入口点脚本如下所示:

# some_other_script.py
import module # prints "<module.core.Clazz object at 0x00BBAA90>"
print module.c # Access c *within module*

一切都会正常进行。这将from core import * 和/或 from module import * 一起工作,但我(和 PEP8)反对这样做只是因为当您开始乱搞乱七八糟的导入时,您并不清楚脚本中发生了什么。为清楚起见:

# module/core.py

def core_func():
return 1


# module/__init__.py

from core import *
def mod_func():
return 2

上面的内容确实非常好,尽管您也可以将 core 设置为“私有(private)”(重命名为 _core)以表明没有理由从不再包裹外。

# some_other_script.py

from module import *

print core_func() # Prints 1
print mod_func() # Prints 2

关于具有从子模块导入到根命名空间的方法的 Python 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15347682/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com