从一个模块中导入其名称的子模块

2024-10-03 21:27:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我在子模块db.db_1中有一个名为prepared_db的函数:

from spam import db

submodule_name = "db_1"
func_name = "prepare_db"
func = ...

如何通过上面上下文中的子模块名和函数名来获取函数?在

更新

为了回应@histrio的回答,我可以验证他的代码是否适用于os模块。但在这种情况下它不起作用。创建示例:

^{pr2}$

现在,可以正常导入:

>>> from spam.db.db_1 import prepare_db
>>> prepare_db()
prepare_db func

但是如果你动态地这样做,我会得到一个错误:

>>> getattr(getattr(db, submodule_name), func_name)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-9-1b6aa1216551> in <module>()
----> 1 getattr(getattr(db, submodule_name), func_name)

AttributeError: module 'spam.db.db_1' has no attribute 'prepared_db'

Tags: 模块函数namefromimportdbspamprepare
2条回答

很简单。可以将模块视为对象。在

import os

submodule_name = "path"
func_name = "exists"

submodule = getattr(os, submodule_name)
function = getattr(submodule, func_name)
function('/home') # True

或者[只是为了好玩,不要那样做]

^{pr2}$

更新

import importlib
submodule = importlib.import_module('.'+submodule_name, module.__name__)
function = getattr(submodule, func_name)

我想我已经想好了,您需要将函数添加到__init__.py文件中的__all__变量中,这样就可以大致如下:

from .db_1 import prepare_db

__all__ = ['prepare_db']

在那之后,它应该可以正常工作了。在

相关问题 更多 >