Python2反射:__ import的奇怪行为__()

时间:2015-09-23 08:41:25

标签: python reflection python-import

我需要一个通用脚本,它将 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。 那是为什么?

1 个答案:

答案 0 :(得分:1)

the documentation -

中所述
  

当name变量的格式为package.module时,通常会返回顶级包(直到第一个点的名称),而不是按名称命名的模块。

为什么呢?因为我们假设您要求它导入blah.something,所以应返回的内容为blah somethingblah内的属性(因此要求使用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

如果您只是从模块或包等导入模块或函数,上述方法也适用。