我需要一个以some_module.function为参数并执行它的通用脚本。我为此编写了一个解决方案(必须是Python2.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()的结构。为什么会这样呢?
发布于 2015-09-23 08:54:06
如文件-中所示
当名称变量是表单
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如果您只是简单地导入模块,或者从模块或包中导入一个函数,那么上面的内容也是有效的。
https://stackoverflow.com/questions/32734778
复制相似问题