2013-02-25 93 views
1

我想根据python中的变量的值调用不同的导入。python中导入语句的列表

通常我会用一个switch语句做到这一点,但很可惜Python有没有...

我在想,我的功能列表,每个都包含不同的进口,但有没有更好的办法?是否有可能以类似的方式列出导入?或者将模块名称作为字符串存储在列表中,然后将它们转换为可用于导入它们的表单?

感谢

+2

Python中相当于一个switch语句:'如果... ELIF ... ELIF ... else' 。可选:'optionsDict = {conditionA:funcA,conditionB:funcB,...}; optionsDict [someCondition]()' – 2013-02-25 15:07:13

+0

为什么你需要做条件输入?你的模块是否有许多来自顶级代码的副作用?你有很多名称冲突的模块吗?你很有可能在这里治疗症状而不是疾病。 – 2013-02-25 15:12:26

+1

另外,请考虑使用使你的意图清晰的内容,如[stevedore'](http://stevedore.readthedocs.org/en/latest/index.html)。 (我的预感是你想要它的“驱动程序”,但是你没有描述你的用例,这是一个问题,因为这意味着你的问题可能有XY问题) – millimoose 2013-02-25 15:13:09

回答

8

如果你想以编程方式导入一个模块,你可以做

module = __import__('module_name') 

这似乎是一个奇怪的情况,以发现自己虽然..请检查您的设计和谨慎行事。

+0

这与将键值映射到模块名称的列表或字典相结合,可能是最简单的方式。但是,如果您发现自己需要使用条件导入,那么我会对@ wim的评论说,您应该多加考虑如何布置代码。 – 2013-02-25 15:09:11

+0

未来的读者:@Charles布朗答案应该是真正的接受答案。 'importlib'是比我更好的选择。 – wim 2013-03-13 05:32:14

2

为什么不使用if

if a is "import_module1": 
    import module1 
elif a is "import_module2": 
    import module2 
4

通常,在Python中,您可以用字典替换switch结构。要使用存储到字符串中的名称导入模块,可以使用importlib.import_module()。这里有一个例子:

from importlib import import_module 

modlist = {'case 1': ('package1', 'module1'), 'case 2': ('package2', 'module2')} 

myvar = 'case 2' 

mypackage, mymodule = modlist[myvar] 
import_module(mymodule, mypackage) 
0

从我自己的代码http://felicitous-desktop.googlecode.com/files/felicitous.py

脚本示例设置桌面背景。根据不同的桌面是Windows或Gnome的,它导入不同的库:

if (platform.system() == "Windows"): 
    set_windows_background(dest) 
else: 
    set_gnome_background(dest) 

其中

def set_gnome_background(x): 
    import gconf 
    client = gconf.client_get_default() 
    client.set_string ("/desktop/gnome/background/picture_filename",x)    

def set_windows_background(x): 
    import ctypes 
    SPI_SETDESKWALLPAPER = 20 # According to http://support.microsoft.com/default.aspx?scid=97142 
    import tempfile 
    from PIL import Image 
    image = Image.open(x) 

    bmppath= os.path.normpath(os.path.expanduser("~/epic.bmp")) 
    image.save (bmppath, "BMP") 
    print bmppath 
    ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, bmppath , 0)