在 Python 中使用动态导入有什么意义?

What is the point of using dynamic import in Python?

假设有一堆 classes 并且根据传入的参数需要检测 class 并且需要调用其句柄方法。

可能class有


class A:
    def handle(self):
       print('handle method of A class is invoking')

class B:
    def handle(self):
       print('handle method of B class is invoking')

class C:
    def handle(self):
       print('handle method of C class is invoking')

class D:
    def handle(self):
       print('handle method of D class is invoking')

class E:
    def handle(self):
       print('handle method of E class is invoking')

那么您是否建议像下面这样映射 classes?

class_mapping = {
    'a': A,
    'b': B,
    'c': C,
    'd': D,
    'e': E,
}

class Handler:
   def __init__(self, param):
      klass = class_mapping[param]
      instance = klass()
      instance.handle()

或者映射 classes 路径并动态导入?为什么?

class_path_mapping = {
    'a': "folder_name.A",
    'b': "folder_name.B",
    'c': "folder_name.C",
    'd': "folder_name.D",
    'e': "folder_name.E",
}

class DynamicImportHandler:
   def __init__(self, param):
      klass = importlib.import_module(class_path_mapping[param])
      instance = klass()
      instance.handle()

我建议遵循通常的规则:

  1. 如果预先知道要加载的 python 组模块,则导入它们。 well-written 模块在导入时不应有任何副作用,包括过度的 CPU 或 I/O 负载。换句话说,导入应该是一个廉价的操作。

  2. 在事先不知道要加载的模块的情况下保留动态加载,例如 plug-in 系统。

如果您认为您的情况不符合一般规则,请提供更多信息。

使用 class_mapping 字典的第一个案例是:

handler = class_mapping[param] # create an instance

然后:

handler.handle() # invoke the method