Pythonic 函数重载?

Pythonic function overloading?

我无法理解执行此操作的简洁方法。我想要一个名为 set_delay() 的函数,它接受各种参数。我有 3 种不同的“延迟类型”可以设置:恒定、均匀和正常。这是我目前拥有的:

def set_delay_constant(delay):
    continue

def set_delay_uniform(min_delay, max_delay):
    continue

def set_delay_normal(mean, std_dev, timeout):
    continue

我遇到的问题是每个函数中大约 80% 的代码是重复的。我看到的想法是:

def set_delay(delay_type, delay=None, min_delay=None, max_delay=None, mean=None, std_dev=None, timeout=None):
    continue

但是当我需要用更多延迟类型扩展它时,我发现它变得很长而且难以阅读。解决这个问题的最“pythonic”方法是什么?谢谢!

不要使用重载。如果您要解决的问题是 “每个函数中约有 80% 的代码是重复的”,更好的解决方案是将该代码提取到它自己的函数中,例如,将其命名为 _set_delay,然后从每个 set_delay_* 函数中调用它。

对我来说,重载仅在参数重叠的地方才有意义,但 none 在您的情况下才有意义。相比之下,假设我写 range(10) 但后来我意识到我想从 1 开始;由于重载,我可以简单地将它更改为 range(1, 10)。同时,如果我在你提议的 set_delay 中添加一个论点,我会得到 完全不同的行为

我个人会转向基于 class 的结构:

from abc import ABC, abstractmethod

class Delay(ABC):
    def do_delay(self):
        self._prepare_delay()
        #put the 80% of overlapping code here

    @abstractmethod
    def _prepare_delay(self):
        pass


class ConstantDelay(Delay):
    def __init__(self, delay):
        self.delay = delay
        #custom code can go here

    def _prepare_delay(self)
        #more custom code here

class UniformDelay(Delay):
    def __init__(self, min_delay, max_delay):
        self.min_delay = min_delay
        self.max_delay = max_delay
        #custom code goes here

    def _prepare_delay(self)
        #more custom code here

#etc

那么你的 set_delay 函数将接受一个参数,一个 Delay subclass:

的实例
def set_delay(delay):
    pass