首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python2反射:__import__()的奇怪行为

Python2反射:__import__()的奇怪行为
EN

Stack Overflow用户
提问于 2015-09-23 08:41:24
回答 1查看 35关注 0票数 0

我需要一个以some_module.function为参数并执行它的通用脚本。我为此编写了一个解决方案(必须是Python2.4兼容的.):

代码语言:javascript
复制
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,我必须这样做:

代码语言:javascript
复制
module = __import__('lib')
module.lib.f_x()

而不是我所期望的:

代码语言:javascript
复制
module = __import__('lib')
module.f_x()

或者像上面一样使用getattr()的结构。为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-23 08:54:06

文件-中所示

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

为什么?因为您要求它导入blah.something,所以应该返回的是blah,其中somethingblah中的一个属性(因此需要使用getattr)。

一个简单的解决办法应该是-

代码语言:javascript
复制
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

如果您只是简单地导入模块,或者从模块或包中导入一个函数,那么上面的内容也是有效的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32734778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档