编辑#1:我已经按照建议使用“手动”基于 if/else 的解决方案更新了示例,以证明需要进一步自动化。
在基于关键字参数名称而不是类型选择目标函数的情况下,如何有效地调度函数(即实现类似multimethods的函数)?
我的用例是为数据类实现多个工厂方法,这些数据类的字段相互依赖,并且可以根据这些字段的不同子集进行初始化,例如
下面是一个使用递归的示例,它可以正常工作,但需要大量手写的容易出错的代码,并且不能真正扩展到更复杂的情况。
def a_from_b_c(b, c):
return b+c
def b_from_a_c(a, c):
return a+c
def c_from_a_b(a, b):
return a**b
@datalass
class foo(object):
a: float
b: float
c: float
@classmethod
def init_from(cls, **kwargs):
if "a" not in kwargs and all(k in kwargs for k in ("b", "c")):
kwargs["a"] = a_from_b_c(kwargs["b"], kwargs["c"])
cls.init_from(**kwargs)
if "b" not in kwargs and all(k in kwargs for k in ("a", "c")):
kwargs["b"] = b_from_a_c(kwargs["a"], kwargs["c"])
cls.init_from(**kwargs)
if "c" not in kwargs and all(k in kwargs for k in ("a", "b")):
kwargs["c"] = c_from_a_b(kwargs["a"], kwargs["b"])
cls.init_from(**kwargs)
return cls(**kwargs)
我正在寻找一种解决方案,该解决方案可以扩展到具有许多字段和复杂初始化路径的数据类,而另一方面需要更少的手写代码,并且有很多重复和错误来源.. 上面代码中的模式非常明显并且可以是自动化的,但我想确保在这里使用正确的工具。