python:无状态函数库设计

max*_*max 5 python python-3.x

我正在构建一个包含各种函数的库,这些函数将在项目中经常重用。每个函数都是无状态的(创建时不需要参数,并且没有任何内存)。有些函数使用其他函数。

这些函数将作为参数在项目的其余部分传递。

以下哪种方法更好?

1.将某个模块中的所有函数定义为全局函数:

def f1(x):
  # use x

def f2(x):
  # use x and f1
Run Code Online (Sandbox Code Playgroud)

2.将所有函数定义为类中的方法,并根据用途将类排列在层次结构中:

class F1:
  def __call__(x):
    # use x

f1 = F1()

class F2(F1):
  def __call__(x):
    # use x and f1

f2 = F2()
Run Code Online (Sandbox Code Playgroud)

我什至考虑选项 2 的原因是我的一些功能有一些共同点。例如,函数f2, f3,f11都通过调用 开始f1。我想我可能想做这样的事情:

class F1:
  def __call__(self, x):
     self.f1(x)
     self.calc(x)
  def f1(self, x):
     # do something
  # don't define calc here; F1 is abstract base class 

class F2(F1):
  def calc(self, x):
     # do something

class F3(F1):
  def calc(self, x):
     # do something
Run Code Online (Sandbox Code Playgroud)

gps*_*gps 3

选项 1 更简单。选项 2 太复杂了!

另一个可能使测试更容易的建议:

1.1. 将它们全部定义为一个模块中单个类的方法。适当使用 @staticmethod 和 @classmethod 装饰器。这可以使它们更容易用模拟替换或通过稍后提供新类或子类来覆盖替代实现。

垃圾邮件.py:

class Spam(object):
  @staticmethod
  def f1(x):
    # use x

  @classmethod
  def f2(cls, x):
    # use x and cls.f1
Run Code Online (Sandbox Code Playgroud)

这仍然更复杂,因此您可能只想坚持使用选项 1,直到您需要上述内容。