2016-01-22 96 views
2

我有一个子模块db.db_1称为prepared_db功能:导入它的名字的子模块从一个模块

from spam import db 

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

我怎么可以得到由子模块的名称和功能名称的功能在上面的背景?

UPDATE

为了应对@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' 

回答

1

我想我想通了,你需要将功能添加到__init__.py文件中的__all__变量,所以这将成为以下内容的一部分:

from .db_1 import prepare_db 

__all__ = ['prepare_db'] 

之后,它应该工作得很好。

3

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

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) 

UPDATE

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

我曾尝试过你的建议,但它并没有真正起作用。请参阅最新的问题。 – RNA

+0

答复已更新。确实你的情况有点复杂:) – histrio

+0

你有解释为什么它在'os'模块中工作,但不是我的情况? – RNA