问题描述
实现以下行为的最佳方法是什么:我有一个由函数 ans = my_interface(args)
表示的接口,我有此函数的多个实现,并且我想授予用户选择其中一个实现的权限通过设置参数。
显而易见的解决方案是使每个实现成为具有相同接口的函数,并在 my_interface
中处理参数并根据其值调用其中一个。如果我想扩展,我需要添加一个具有引擎新实现的新函数,并更改 my_interface
以处理新引擎的名称。我必须知道这里的正确界面。我认为这不是最聪明的方法。
我还希望提供有关这本书或有关此问题的讨论的链接。例如,我在 Keras 中发现了类似的功能,它可以使用 Tensorflow 或 PyTorch 后端。有谁知道它是如何实现的?
解决方法
如果你不想使用类和设计模式,你可以试试这样的:
def _my_interface_engine_A():
print("engine A")
return 0
def _my_interface_engine_B():
print("engine B")
return 1
def _my_interface_engine_C():
print("engine C")
return 2
def my_interface(*args,**kwargs):
engine = kwargs.pop("engine","A") # A is the default engine
return globals()[f"_my_interface_engine_{engine}"](*args,**kwargs)
>>> print(my_interface())
engine A
0
>>> print(my_interface(engine="B"))
engine B
1
如果添加另一个接口,只需将函数命名为 _my_interface_engine_X
并让 my_interface
函数保持不变。
my_interface
充当您其他接口的代理。