使用变量“interpolation”创建import语句

时间:2012-07-09 23:19:46

标签: python import string-interpolation

我有一长串需要导入的可能文件。我只需要其中一个,它们都有相同的界面。 (选择付款网关来处理付款)

假设我有一个代表所有网关文件名称的字典。

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语句实际导入的方法。

这样的事情可能吗?

3 个答案:

答案 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