gpt4 book ai didi

Python 3.5 - 使用 @overload 重载方法

转载 作者:行者123 更新时间:2023-11-30 22:49:31 28 4
gpt4 key购买 nike

有一个overloading Python 3.5+ 的包。使用这个包,可以重新定义方法,但是具有不同的类型提示,并且它的装饰器会找出应该调用哪个重载方法。

常见编码模式:

class foo:
def func(param):
if instance(param, int):
pass
elif instance(param, str):
pass
elif instance(param, list):
pass
else:
raise ValueError()

使用@overload:

class foo:
@overload
def func(param: int):
pass

@overload
def func(param: str):
pass

@overload
def func(param: list):
pass

这是documentation .

<小时/>

我的问题是:

  • 与旧式参数类型切换相比,性能影响有多大?
  • 这个包如何访问类型提示?

最佳答案

自 python 3.4 起,就有了核心 API 功能 functools.singledispatch ,它允许您注册重载函数。

来自文档

>>> from functools import singledispatch
>>> @singledispatch
... def fun(arg, verbose=False):
... if verbose:
... print("Let me just say,", end=" ")
... print(arg)

>>> @fun.register
... def _(arg: int, verbose=False):
... if verbose:
... print("Strength in numbers, eh?", end=" ")
... print(arg)

>>> @fun.register
... def _(arg: list, verbose=False):
... if verbose:
... print("Enumerate this:")
... for i, elem in enumerate(arg):
... print(i, elem)

运行上述函数时(再次来自文档):

>>> fun("Hello, world.")
Hello, world.
>>> fun("test.", verbose=True)
Let me just say, test.
>>> fun(42, verbose=True)
Strength in numbers, eh? 42
>>> fun(['spam', 'spam', 'eggs', 'spam'], verbose=True)
Enumerate this:
0 spam
1 spam
2 eggs
3 spam

警告:仅输入第一个参数!

此外,(自 python 3.8 起)还有一个用于类方法调用的等效装饰器 functools.singledispatchmethod

关于Python 3.5 - 使用 @overload 重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39748842/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com