Python 中的多态参数列表

原文标题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)

我的直觉告诉我,这是一种处理多态性的可怕方法,但我想不出更好的方法。

原文链接:https://stackoverflow.com//questions/71685848/polymorphic-argument-lists-in-python

回复

我来回复
  • ShadowRanger的头像
    ShadowRanger 评论

    对于不太复杂的场景,我建议使用functools.singledispatch。不过,尝试使这项工作适用于可变参数场景将是相当难看的。我能想到的最佳解决方案是在argstuple的每个元素上由my_method调用一个单独的函数,并用functools.singledispatch实现该单独的函数。

    需要明确的是,在底层,functools.singledispatch实际上只是做了一个稍微优化的版本isinstance检查(它维护dict映射类型到实现函数;如果注册了确切类型,则查找是O(1),但对于子类和 ABC 等,它必须回退到线性扫描)。但它通常看起来比将它们全部混合在一个实现一大堆类型行为的函数中更干净。

    2年前 0条评论