我想根据python中的变量的值调用不同的导入。python中导入语句的列表
通常我会用一个switch语句做到这一点,但很可惜Python有没有...
我在想,我的功能列表,每个都包含不同的进口,但有没有更好的办法?是否有可能以类似的方式列出导入?或者将模块名称作为字符串存储在列表中,然后将它们转换为可用于导入它们的表单?
感谢
我想根据python中的变量的值调用不同的导入。python中导入语句的列表
通常我会用一个switch语句做到这一点,但很可惜Python有没有...
我在想,我的功能列表,每个都包含不同的进口,但有没有更好的办法?是否有可能以类似的方式列出导入?或者将模块名称作为字符串存储在列表中,然后将它们转换为可用于导入它们的表单?
感谢
如果你想以编程方式导入一个模块,你可以做
module = __import__('module_name')
这似乎是一个奇怪的情况,以发现自己虽然..请检查您的设计和谨慎行事。
这与将键值映射到模块名称的列表或字典相结合,可能是最简单的方式。但是,如果您发现自己需要使用条件导入,那么我会对@ wim的评论说,您应该多加考虑如何布置代码。 – 2013-02-25 15:09:11
未来的读者:@Charles布朗答案应该是真正的接受答案。 'importlib'是比我更好的选择。 – wim 2013-03-13 05:32:14
为什么不使用if
?
if a is "import_module1":
import module1
elif a is "import_module2":
import module2
通常,在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)
从我自己的代码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)
Python中相当于一个switch语句:'如果... ELIF ... ELIF ... else' 。可选:'optionsDict = {conditionA:funcA,conditionB:funcB,...}; optionsDict [someCondition]()' – 2013-02-25 15:07:13
为什么你需要做条件输入?你的模块是否有许多来自顶级代码的副作用?你有很多名称冲突的模块吗?你很有可能在这里治疗症状而不是疾病。 – 2013-02-25 15:12:26
另外,请考虑使用使你的意图清晰的内容,如[stevedore'](http://stevedore.readthedocs.org/en/latest/index.html)。 (我的预感是你想要它的“驱动程序”,但是你没有描述你的用例,这是一个问题,因为这意味着你的问题可能有XY问题) – millimoose 2013-02-25 15:13:09