我想公开一个具有多态参数列表接口的方法:
def my_method(*args: Union[str, Type[MyType], Dict[str, Dict[str, str]] ):
pass上下文是,我希望允许一种注册MyType和初始化器参数的方法。MyType有一个名称属性,它是一个字符串。(这很有用,因为多个类可以映射到同一个名称,而且类的类别是运行时可选择的)。Dict[str, Dict[str, str]]将此字符串名映射到要传递给字符串的匹配类的参数。
这样客户就可以打电话:
my_method("my_special_class"
FastMySpecialClass,
{"my_special_class": {"arg1": "foo", "arg2", "bar"}}
)现在,在my_method()中,我唯一能想到的处理方法是使用isinstance()开关/情况。无论是使用elseif还是某些类型的处理程序函数。就像这样:
for arg in args:
argument_resolver[type(arg)](arg)我的直觉告诉我,这是一个可怕的方法来处理多态性,但我想不出更好的东西。
发布于 2022-03-31 01:35:08
对于不太复杂的场景,我建议使用using functools.singledispatch。但是,试图使这个工作适合于一个varargs场景将是相当丑陋的。我能想到的最好的解决方案是有一个由my_method在args tuple的每个元素上调用的单独的函数,并使用functools.singledispatch实现这个单独的函数。
清楚地说,functools.singledispatch实际上只是在做一个稍微优化的isinstance检查版本(它维护一个dict映射类型以实现函数;如果注册了确切的类型,则查找是O(1),但是对于子类和ABC之类的类,它必须返回到线性扫描)。但是,它通常比把它们混合在一个函数中看起来更干净,这个函数实现了一整堆类型的行为。
https://stackoverflow.com/questions/71685848
复制相似问题