我需要一个通用脚本,它将 some_module.function 作为参数并执行它。 我为此编写了一个解决方案(必须与Python-2.4兼容......):
def get_function(f_name):
"""Return function from library..."""
lib, f = f_name.rsplit('.', 1)
module = getattr(__import__(lib), lib.rsplit('.', 1)[-1])
return getattr(module, f)
f = get_function('my_libs.testlib.test_function')
# finally, this executes the function
f()
我的问题是:
为什么我必须在 getattr()
之后执行 __import__()
?
结果module = __import__('lib')
将 lib 上的名称空间置于上面。
所以当我想从 lib 调用一个函数时,比如说 lib.f_x ,我必须这样做:
module = __import__('lib')
module.lib.f_x()
而不是我期望的:
module = __import__('lib')
module.f_x()
或者如上所述使用带getattr()
的contruct。
那是为什么?
答案 0 :(得分:1)
当name变量的格式为
package.module
时,通常会返回顶级包(直到第一个点的名称),而不是按名称命名的模块。
为什么呢?因为我们假设您要求它导入blah.something
,所以应返回的内容为blah
something
是blah
内的属性(因此要求使用getattr
})。
一个简单的解决方案应该是 -
def get_function(f_name):
"""Return function from library..."""
lib = f_name.rsplit('.', 1)[0]
modl = __import__(lib)
comps = f_name.split('.')[1:]
for comp in comps:
modl = getattr(modl,comp)
return modl
如果您只是从模块或包等导入模块或函数,上述方法也适用。