小能豆

使用变量“导入”创建导入语句

py

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

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

IE

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

根据数据库中的信息,我知道这个字典的键。因此,如果我收到网关值为 1 的付款流程请求,我知道它需要由 Authorize.net 处理。网关值为 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)

哪里gogo有办法使导入语句真正地导入。

这种事可能吗?


阅读 14

收藏
2025-01-03

共1个答案

小能豆

是的,您可以通过动态导入实现这个目标。Python 提供了 importlib 模块,它允许在运行时动态地导入模块,而不需要使用静态的 import 语句。

您可以根据 gateway_file 动态构建模块路径并使用 importlib 来导入相应的模块,然后调用相应的函数。以下是一个示例:

示例代码:

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("未找到对应的网关文件")

解释:

  1. importlib.import_module(module_name) 会动态导入指定的模块。module_name 是通过构建字符串来指定的,可以包含 gateway_interface. 后缀。
  2. getattr(module, "process") 动态获取模块中的 process 函数。
  3. 通过 process_payment() 调用处理支付的函数。

处理流程:

  • 根据 payment_gateway 的值,从 gateways 字典中获取相应的网关名称。
  • 构建模块路径,并使用 importlib.import_module 动态导入。
  • 使用 getattr 获取模块中的 process 函数,并调用它来处理付款。

错误处理:

  • 如果模块不存在或没有 process 函数,会捕获相应的异常并输出错误消息。

这种方法避免了长列表的 elif 语句,并且使得导入和调用过程更加灵活和简洁。

2025-01-03