适用于各种引擎后端的 Python 编程模式

问题描述

实现以下行为的最佳方法是什么:我有一个函数 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 充当您其他接口的代理。