Python 中的多态参数列表
python 183
原文标题 :Polymorphic Argument Lists in Python
我想公开一个具有多态参数列表接口的方法:
def my_method(*args: Union[str, Type[MyType], Dict[str, Dict[str, str]] ):
pass
上下文是我想允许一种方法与初始化参数一起注册MyType
。 MyType 有一个 name 属性,它是一个字符串。 (这很有用,因为多个类可以映射到同一个名称,并且类的类别是运行时可选择的)。Dict[str, Dict[str, str]]
将此字符串名称映射到要传递给字符串匹配类的参数。
所以客户端可以调用:
my_method("my_special_class"
FastMySpecialClass,
{"my_special_class": {"arg1": "foo", "arg2", "bar"}}
)
现在在my_method()
中,我唯一能想到的就是使用isinstance()
开关/外壳。使用elseif
或某些类型的 dict 处理函数。有点像这样:
for arg in args:
argument_resolver[type(arg)](arg)
我的直觉告诉我,这是一种处理多态性的可怕方法,但我想不出更好的方法。
回复
我来回复-
ShadowRanger 评论
对于不太复杂的场景,我建议使用
functools.singledispatch
。不过,尝试使这项工作适用于可变参数场景将是相当难看的。我能想到的最佳解决方案是在args
tuple
的每个元素上由my_method
调用一个单独的函数,并用functools.singledispatch
实现该单独的函数。需要明确的是,在底层,
functools.singledispatch
实际上只是做了一个稍微优化的版本isinstance
检查(它维护dict
映射类型到实现函数;如果注册了确切类型,则查找是O(1)
,但对于子类和 ABC 等,它必须回退到线性扫描)。但它通常看起来比将它们全部混合在一个实现一大堆类型行为的函数中更干净。2年前