繁体   English   中英

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

[英]Python2 reflection: Strange behavior of __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()

我的问题是:

为什么我必须在__import__()之后执行getattr() __import__()

事实证明, module = __import__('lib')的名称空间在lib之一的上方

因此,当我想从lib调用一个函数时,比如说lib.f_x ,我必须这样做:

module = __import__('lib')
module.lib.f_x()

而不是我所期望的:

module = __import__('lib')
module.f_x()

或将结构与getattr()一起使用。 这是为什么?

文档中所给-

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

为什么? 因为可以说你问它导入blah.something ,什么应该返回将是blahsomething是内部的属性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

如果仅导入module或来自模块或包的函数等,上述内容也适用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM