1

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

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

IE

gateways = {
   '1' : 'authorize',
   '2' : 'paysimple',
   '3' : 'braintreepayments',
   '4' : 'etc',
}

我根据数据库中的信息知道这本字典的键。因此,如果我收到网关值为 1 的支付流程请求,我知道它需要由 Authorize.net 处理。A 2 将由 Pay Simple 处理。等等。

我希望能够创建一个使用我知道的信息而不是可怕的语句列表构建的导入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)

wheregogo是一种使 import 语句实际导入的方法。

这样的事情可能吗?

4

3 回答 3

5

最简单的

process = __import__('gateway_interface.'+gateway_file,fromlist=['foo']).process

编辑: fromlist 中的 'foo' 可以是任何东西,只要 fromlist 不是空列表。为什么 Python 的 __import__ 需要来自列表?.

我还必须进行编辑,因为在我的第一篇文章 __import__中没有按预期工作,正如Python 的 __import__ 没有按预期工作中进一步描述的那样。

如果你有 python 2.7

import importlib
process = importlib.import_module('gateway_interface.'+gateway_file).process

WAAAAY 很酷的是使用 package_tools (例如from pkg_resources import iter_entry_points

即使它们位于不在 gateway_interface 下的奇数包中,这也可以为您提供找到正确功能的解决方案。如果它们都在一个地方,并且您不需要那种矫枉过正的风格,那么……是的,只是__import__

于 2012-07-10T00:34:11.340 回答
2

看一下imp模块,它允许您访问 import 语句的内部或__import__方法本身 - 这些中的任何一个都应该允许您实现您所描述的我的想法。

于 2012-07-09T23:23:03.603 回答
1

内置__import__方法应该可以工作:

process = __import__(gateways.get(payment_gateway)).process
于 2012-07-10T00:25:26.193 回答