我有一长串需要导入的文件。我只需要其中的一个,而且它们都有相同的界面。(选择支付网关来处理付款)
假设我有一个字典,它代表所有网关文件的名称。
IE
gateways = { '1' : 'authorize', '2' : 'paysimple', '3' : 'braintreepayments', '4' : 'etc', }
根据数据库中的信息,我知道这个字典的键。因此,如果我收到网关值为 1 的付款流程请求,我知道它需要由 Authorize.net 处理。网关值为 2 的请求将由 Pay Simple 处理。等等。
我希望能够创建一个基于我所知道的信息的导入语句,而不是一个可怕的elif语句列表。
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有办法使导入语句真正地导入。
gogo
这种事可能吗?
是的,您可以通过动态导入实现这个目标。Python 提供了 importlib 模块,它允许在运行时动态地导入模块,而不需要使用静态的 import 语句。
importlib
import
您可以根据 gateway_file 动态构建模块路径并使用 importlib 来导入相应的模块,然后调用相应的函数。以下是一个示例:
gateway_file
import importlib # 假设您有一个字典,其中包含网关文件的名称 gateways = { '1': 'authorize', '2': 'paysimple', '3': 'braintreepayments', '4': 'etc', } # 假设 payment_gateway 代表从数据库获取的网关键 payment_gateway = '1' # 例如,支付网关为 1 # 从字典中获取相应的网关文件名 gateway_file = gateways.get(payment_gateway) # 动态构建 import 字符串并导入 if gateway_file: module_name = f"gateway_interface.{gateway_file}" try: # 使用 importlib 动态导入模块 module = importlib.import_module(module_name) # 假设每个网关文件中都有一个 process 函数 process_payment = getattr(module, "process") # 调用 process 函数处理支付流程 process_payment() except ImportError: print(f"无法导入模块 {module_name}") except AttributeError: print(f"模块 {module_name} 中没有 'process' 函数") else: print("未找到对应的网关文件")
importlib.import_module(module_name)
module_name
gateway_interface.
getattr(module, "process")
process
process_payment()
payment_gateway
gateways
importlib.import_module
getattr
这种方法避免了长列表的 elif 语句,并且使得导入和调用过程更加灵活和简洁。