在 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()
我建议遵循通常的规则:
如果预先知道要加载的 python 组模块,则导入它们。 well-written 模块在导入时不应有任何副作用,包括过度的 CPU 或 I/O 负载。换句话说,导入应该是一个廉价的操作。
在事先不知道要加载的模块的情况下保留动态加载,例如 plug-in 系统。
如果您认为您的情况不符合一般规则,请提供更多信息。
使用 class_mapping
字典的第一个案例是:
handler = class_mapping[param] # create an instance
然后:
handler.handle() # invoke the method
假设有一堆 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()
我建议遵循通常的规则:
如果预先知道要加载的 python 组模块,则导入它们。 well-written 模块在导入时不应有任何副作用,包括过度的 CPU 或 I/O 负载。换句话说,导入应该是一个廉价的操作。
在事先不知道要加载的模块的情况下保留动态加载,例如 plug-in 系统。
如果您认为您的情况不符合一般规则,请提供更多信息。
使用 class_mapping
字典的第一个案例是:
handler = class_mapping[param] # create an instance
然后:
handler.handle() # invoke the method