首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python中的多态参数列表

Python中的多态参数列表
EN

Stack Overflow用户
提问于 2022-03-31 01:26:31
回答 1查看 67关注 0票数 1

我想公开一个具有多态参数列表接口的方法:

代码语言:javascript
复制
def my_method(*args: Union[str, Type[MyType], Dict[str, Dict[str, str]] ):
    pass

上下文是,我希望允许一种注册MyType和初始化器参数的方法。MyType有一个名称属性,它是一个字符串。(这很有用,因为多个类可以映射到同一个名称,而且类的类别是运行时可选择的)。Dict[str, Dict[str, str]]将此字符串名映射到要传递给字符串的匹配类的参数。

这样客户就可以打电话:

代码语言:javascript
复制
my_method("my_special_class"
           FastMySpecialClass,
           {"my_special_class": {"arg1": "foo", "arg2", "bar"}}
)

现在,在my_method()中,我唯一能想到的处理方法是使用isinstance()开关/情况。无论是使用elseif还是某些类型的处理程序函数。就像这样:

代码语言:javascript
复制
for arg in args:
    argument_resolver[type(arg)](arg)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-31 01:35:08

对于不太复杂的场景,我建议使用using functools.singledispatch。但是,试图使这个工作适合于一个varargs场景将是相当丑陋的。我能想到的最好的解决方案是有一个由my_methodargs tuple的每个元素上调用的单独的函数,并使用functools.singledispatch实现这个单独的函数。

清楚地说,functools.singledispatch实际上只是在做一个稍微优化的isinstance检查版本(它维护一个dict映射类型以实现函数;如果注册了确切的类型,则查找是O(1),但是对于子类和ABC之类的类,它必须返回到线性扫描)。但是,它通常比把它们混合在一个函数中看起来更干净,这个函数实现了一整堆类型的行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71685848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档