如果,作为一个简化的例子,我正在编写一个库来帮助人们模拟人口,我可能有一个类,例如:
class Population:
def __init__(self, t0, initial, growth):
self.t0 = t0,
self.initial = initial
self.growth = growth
其中 t0 是日期时间类型。现在我想提供一种方法来确定给定时间的人口,无论是日期时间还是包含自 t0 以来的秒数的浮点数。此外,调用者提供这样的时间数组是合理的(如果是这样,我认为假设它们都属于同一类型是合理的)。我可以看到至少有两种方法可以做到这一点:
每种类型的方法
def at_raw(self, t): if not isinstance(t, collections.Iterable): t = numpy.array([t]) return self.initial*numpy.exp(self.growth*t) def at_datetime(self, t): if not isinstance(t, collections.Iterable): t = [t] dt = numpy.array([(t1-self.t0).total_seconds() for t1 in t]) return self.at_raw(dt)
通用方法
def at(self, t): if isinstance(t, datetime): t = (t-self.t0).total_seconds() if isinstance(t, collections.Iterable): if isinstance(t[0], datetime): t = [(t1-self.t0).total_seconds() for t1 in t] else: t = np.array([t]) return self.initial*numpy.exp(self.growth*t)
两者都可以,但我不确定哪个更pythonic。我已经看到一些建议,类型检查表明糟糕的设计会建议方法 1,但由于这是一个供其他人使用的库,方法 2 可能会更有用。
请注意,有必要支持以浮点数形式给出的时间,即使只有库本身使用此功能,例如,我可能会实现一种方法,该方法在更复杂的模型中根查找固定点,其中浮点表示显然更可取。提前感谢您的任何建议或意见。