我正在梳理和简化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"值,以便函数调用正常工作。
在这种情况下,这两种模式中的哪一种是更好的解决方案?
在提供的两个选项中,第一个听起来像是更好的方法。
这是因为第二个选项不必要地揭示了所有调用方都必须了解和依赖的实现细节。
实现第一个选项时,您可以在类或模块中将共享函数 C()
设为私有。在 python 中,这通常是通过命名约定来完成的:对于模块私有,在函数名称前面加上单个下划线,在函数名称前面加上双下划线表示类私有。
这听起来像是使用装饰器函数的一个很好的理由。包装器函数执行重复代码,而最里面的函数定义为单独的代码。例如,请参阅如何制作函数装饰器链的答案?
因此,您将使通用代码 A 和两个函数 B 和 C
def A():
@A
def B():
@A
def C():
例如,通过 12 个简单的步骤了解 Python 装饰器!