[英]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
,什么应该返回将是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
如果仅导入module或来自模块或包的函数等,上述内容也适用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.