Python:如何从一个函数进行全局导入
我担心这是一个混乱的方式来解决这个问题,但…
假设我想根据一些条件在Python中进行一些导入。
为此我想写一个函数:
def conditional_import_modules(test): if test == 'foo': import onemodule, anothermodule elif test == 'bar': import thirdmodule, and_another_module else: import all_the_other_modules
现在,我怎样才能有import模块全球可用?
例如:
conditional_import_modules(test='bar') thirdmodule.myfunction()
导入的模块只是variables – 名称绑定到一些值。 因此,所有你需要的是导入他们,并使他们与global
关键字global
。
例:
>>> math Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'math' is not defined >>> def f(): ... global math ... import math ... >>> f() >>> math <module 'math' from '/usr/local/lib/python2.6/lib-dynload/math.so'>
你可以在这样的函数中进行全局导入:
def my_imports(module_name): globals()[module_name] = __import__(module_name)
你可以用这个函数返回你想要导入的模块的名字,然后使用
mod == __import__(module_name)
您可以使用内置函数__import__
有条件地导入具有全局范围的模块。
导入顶级模块(想想: import foo
):
def cond_import(): global foo foo = __import__('foo', globals(), locals())
从层次导入(想想: import foo.bar
):
def cond_import(): global foo foo = __import__('foo.bar', globals(), locals())
从层次结构和别名中import foo.bar as bar
(想想: import foo.bar as bar
):
def cond_import(): global bar foo = __import__('foo.bar', globals(), locals()) bar = foo.bar
我喜欢@巴西尔的方法。
def global_imports(modulename,shortname = None, asfunction = False): if shortname is None: shortname = modulename if asfunction is False: globals()[shortname] = __import__(modulename) else: globals()[shortname] = eval(modulename + "." + shortname)
所以传统上是在类模块中的东西:
import numpy as np import rpy2 import rpy2.robjects as robjects import rpy2.robjects.packages as rpackages from rpy2.robjects.packages import importr
可以转化为全球范围:
global_imports("numpy","np") global_imports("rpy2") global_imports("rpy2.robjects","robjects") global_imports("rpy2.robjects.packages","rpackages") global_imports("rpy2.robjects.packages","importr",True)
可能会有一些错误,我会validation和更新。 最后一个例子也可以有一个别名,这个别名可能是另一个“短名”或者像“importr | aliasimportr”