>>> import_path('os.path.join')
<function join at 0x22d4050>
什么是最简单的方式来编写import_path
(在Python 2.6及以上版本)?假设最后的组件总是可以在模块/包中调用。在给出完整模块路径的情况下动态导入可调用对象?
>>> import_path('os.path.join')
<function join at 0x22d4050>
什么是最简单的方式来编写import_path
(在Python 2.6及以上版本)?假设最后的组件总是可以在模块/包中调用。在给出完整模块路径的情况下动态导入可调用对象?
这似乎是你想要什么:
def import_path(name):
modname, _, attr = name.rpartition('.')
if not modname:
# name was just a single module name
return __import__(attr)
m = __import__(modname, fromlist=[attr])
return getattr(m, attr)
为了使其与Python 2.5和更早,其中__import__
不采取关键字参数,你需要使用:
m = __import__(modname, {}, globals(), [attr])
尝试
def import_path(name):
(mod,mem) = name.rsplit('.',1)
m = __import__(mod, fromlist=[mem])
return getattr(m, mem)
作品至少
>>> import_path('os.walk')
<function walk at 0x7f23c24f8848>
现在
>>> import_path('os.path.join')
<function join at 0x7f7fc7728a28>
试试吧为'os.path.join'并让我知道它是否工作。 :-) – 2010-02-01 19:07:16
呃,__import__语义是愚蠢的 – 2010-02-01 19:31:32
@sridhar幸运的是,它很容易解决,请参阅我的最新编辑 – 2010-02-01 21:16:25
显然以下工作:
>>> p = 'os.path.join'
>>> a, b = p.rsplit('.', 1)
>>> getattr(__import__(a, fromlist=True), b)
<function join at 0x7f8799865230>
我是不是滥用'fromlist'参数? – 2010-02-01 19:09:43
是的,你是:) – 2010-02-01 19:13:07
完成,感谢您的注意。 – 2011-03-13 06:38:04