我有一长串需要导入的可能文件。我只需要其中一个,它们都有相同的界面。 (选择付款网关来处理付款)
假设我有一个代表所有网关文件名称的字典。
即
gateways = {
'1' : 'authorize',
'2' : 'paysimple',
'3' : 'braintreepayments',
'4' : 'etc',
}
我根据数据库中的信息知道这本词典的关键字。因此,如果我收到网关值为1的付款流程请求,我知道它需要由Authorize.net处理。 Pay 2将由Pay Simple处理。等
我希望能够创建一个使用我所知道的信息构建的import语句,而不是一个可怕的elif
语句列表。
考虑以下简单方法:
# For the purposes of this example assume payment_gateway is defined
# elsewhere and represents the key to the dictionary
gateway_file = gateways.get(payment_gateway)
import_str = "from gateway_interface.%s import process" % gateway_file
gogo(import_str)
其中gogo
是导致import语句实际导入的方法。
这样的事情可能吗?
答案 0 :(得分:5)
最简单
process = __import__('gateway_interface.'+gateway_file,fromlist=['foo']).process
编辑:fromlist中的'foo'可以是任何内容,只要fromlist不是空列表。 Why does Python's __import__ require fromlist?中解释了一点点奇怪。
我还必须进行编辑,因为在我的第一篇帖子__import__
中,Python's __import__ doesn't work as expected中没有按预期进行操作。
如果你有python 2.7
import importlib
process = importlib.import_module('gateway_interface.'+gateway_file).process
WAAAAY cool将使用package_tools(例如from pkg_resources import iter_entry_points
)
即使它们位于不在gateway_interface下的奇数包中,这也可以为您提供找到正确功能的解决方案。如果他们都在一个地方而你不需要那些过分杀戮的点......所以只是__import__
答案 1 :(得分:2)
查看imp模块,它允许您访问import语句的内部,或__import__
方法本身 - 其中任何一个都应该允许您实现您所描述的内容。
答案 2 :(得分:1)
内置__import__
方法应该有效:
process = __import__(gateways.get(payment_gateway)).process