防止重复代码;参数化单个函数,还是创建两个单独的函数?

时间:2016-02-02 19:56:14

标签: python design-patterns splinter

我正在梳理和简化python项目的代码库。我使用的称为Splinter的硒包装库的本质是,我发现自己编写了许多代码,这些代码存在细微差别,可能在我搜索的元素中,或者很小改变选择逻辑,不同参数等。

目前,我可能有两个独立的功能,其中90%的代码复制并粘贴在它们之间。 我对凝聚这个并保持一致的两个想法如下:

1)创建三个函数:A,B和C.函数A和B将直接调用并具有单个参数。然后,这些函数使用给定的参数调用函数C,然后正确识别'参数,用于更改函数C的工作方式。函数C永远不会被直接调用。

def A(x):
    return C(x, 0)

def B(y):
    return C(y, 1)

def C(a, b):
    if b:
        # Logic for B
    else:
        # Logic for A

2)创建一个函数,并使用两个参数。第一个参数是您传入A或B的参数,第二个参数是'标识符'部分。

def D(x,i):
    if i == 'case 1':
    elif i == 'case 2':
    else:

'标识符'部分是我不喜欢的。在参数中使用特定关键字或值来调用函数是否有气味?

选项1产生另外两个功能来处理,但选项2使用户知道这些特殊的ID' ID'值以使函数调用正常工作。

在这种情况下,这两种模式中哪一种更好?

2 个答案:

答案 0 :(得分:1)

这听起来是使用装饰器功能的一个很好的理由。包装函数执行重复代码,而最内层函数定义为单独代码。例如,请参阅How to make a chain of function decorators?

的答案

因此,您可以使用公共代码A和两个函数B和C

def A():

@A
def B():

@A
def C():

例如Understanding Python Decorators in 12 Easy Steps!

答案 1 :(得分:1)

在提出的两个选项中,第一个听起来更好。

这是因为第二个选项不必要地揭示了所有呼叫者必须知道和依赖的实现细节。

实现第一个选项时,可以在类或模块中使共享函数C()成为私有函数。在python中,这通常是通过命名约定来完成的:在函数名前加上一个下划线用于模块私有,并在函数名前面添加双重下划线用于类私有。