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
我无法理解执行此操作的简洁方法。我想要一个名为 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