从模块中导入带有其名称的子模块
import a submodule with its name from a module
我在子模块 db.db_1
中有一个名为 prepared_db
的函数:
from spam import db
submodule_name = "db_1"
func_name = "prepare_db"
func = ...
如何通过上面上下文中的子模块名称和函数名称获取函数?
更新:
为了回应@histrio 的回答,我可以验证他的代码适用于 os
模块。但在这种情况下不起作用。要创建示例:
$ mkdir -p spam/db
$ cat > spam/db/db_1.py
def prepare_db():
print('prepare_db func')
$ touch spam/db/__init__.py
$ PYTHONPATH=$PYTHONPATH:spam
现在可以正常导入了:
>>> 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'
很简单。您可以将模块视为对象。
import os
submodule_name = "path"
func_name = "exists"
submodule = getattr(os, submodule_name)
function = getattr(submodule, func_name)
function('/home') # True
或[只是为了好玩,不要那样做]
fn = reduce(getattr, ('sub1', 'sub2', 'sub3', 'fn'), module)
更新
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']
在那之后,它应该可以正常工作。
我在子模块 db.db_1
中有一个名为 prepared_db
的函数:
from spam import db
submodule_name = "db_1"
func_name = "prepare_db"
func = ...
如何通过上面上下文中的子模块名称和函数名称获取函数?
更新:
为了回应@histrio 的回答,我可以验证他的代码适用于 os
模块。但在这种情况下不起作用。要创建示例:
$ mkdir -p spam/db
$ cat > spam/db/db_1.py
def prepare_db():
print('prepare_db func')
$ touch spam/db/__init__.py
$ PYTHONPATH=$PYTHONPATH:spam
现在可以正常导入了:
>>> 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'
很简单。您可以将模块视为对象。
import os
submodule_name = "path"
func_name = "exists"
submodule = getattr(os, submodule_name)
function = getattr(submodule, func_name)
function('/home') # True
或[只是为了好玩,不要那样做]
fn = reduce(getattr, ('sub1', 'sub2', 'sub3', 'fn'), module)
更新
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']
在那之后,它应该可以正常工作。