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”