Python 干式函数编程:如何避免在不同的高阶函数中出现相同的代码行
假设我们有以下设置(让它用Python编写,但语言不是必需的): 如您所见,此设计不太好,至少是因为:Python 干式函数编程:如何避免在不同的高阶函数中出现相同的代码行,python,functional-programming,higher-order-functions,Python,Functional Programming,Higher Order Functions,假设我们有以下设置(让它用Python编写,但语言不是必需的): 如您所见,此设计不太好,至少是因为: dim1、dim2、dim3=set_dims(变量、度)行正在一次又一次地重复。对于这些提供程序方法的签名,我可能会说同样的话——但我们不要那么挑剔,至少我能忍受:) set_dims函数将额外应用一次:在调用f2_提供程序(vars2,degree2)期间,它的结果是已知的。但是,它会在第三个提供者的调用期间再次运行 如何以功能性的方式对其进行返工 如果我们在OOP中,应该引入一个类,
行正在一次又一次地重复。对于这些提供程序方法的签名,我可能会说同样的话——但我们不要那么挑剔,至少我能忍受:)dim1、dim2、dim3=set_dims(变量、度)
函数将额外应用一次:在调用set_dims
期间,它的结果是已知的。但是,它会在第三个提供者的调用期间再次运行f2_提供程序(vars2,degree2)
如果我们在OOP中,应该引入一个类,比如
GeneralProvider
,将set\u dims
调用放入其构造函数中,并将这些提供程序公开。不,不太有趣:)。这个解决方案适合您吗
def f1_提供程序(变量、度、*dims):
def f1(*args1):
# ...
#使用变量和DIM
# ...
返回f1
def f2_提供程序(变量、度、*dims):
def f2(*args2):
# ...
#使用变量和DIM
# ...
返回f2
def f3_提供程序(变量、度、*dims):
def f3(*args3):
# ...
#使用变量和DIM
# ...
返回f3
#然后在某处使用它们:
def f1_用户():
# ...
dim1、dim2、dim3=设置dims(变量1、度数1)
f1=f1\U提供程序(变量1、度1、dim1、dim2、dim3)
# ...
def f2_f3_用户():
# ...
dim1、dim2、dim3=设置dims(变量2、度数2)
f2=f2_提供程序(vars2、degree2、dim1、dim2、dim3)
f3=f3_提供程序(vars2、degree2、dim1、dim2、dim3)
# ...
我认为这是一个解决办法,尽管它很难看。但从理论上讲,这应该是可行的)。我仍在等待更好的解决方案
def f1_provider(vars_, dim1, dim2, dim3):
def f1(*args1):
# ...
# use vars_ and dims
# ...
return f1
def f2_provider(vars_, dim1, dim2, dim3):
def f2(*args2):
# ...
# use vars_ and dims
# ...
return f2
def f3_provider(vars_, dim1, dim2, dim3):
def f3(*args3):
# ...
# use vars_ and dims
# ...
return f3
def general_provider(providers, vars_, degree):
dim1, dim2, dim3 = set_dims(vars_, degree)
return [f_prov(vars_, dim1, dim2, dim3) for f_prov in providers]
# then use them somewhere:
def f1_user():
# ...
f1 = general_provider((f1_provider,), vars1, degree1)
# ...
def f2_f3_user():
# ...
f2, f3 = general_provider((f2_provider, f3_provider), vars2, degree2)
# ...
恐怕不行。虽然它解决了提到的第二个问题,但我认为它引入了更多的样板文件。我们现在必须复制所有这些长参数集。但更糟糕的是,它打破了抽象层次:
f_用户
不需要了解dim
s和set_dims
。无论如何,谢谢你的帮助:)谢谢你的问题,你让我思考好了,如果你要求调用是f3\u提供者(vars2,degree2)
,那么没有神奇的方法来获取这些DIM,除非你再次调用get\u dims
。使用相同的vars2,degree2
的上一次调用的持久性似乎不在您的接受标准中,因为您需要一种功能性方法。因此,这标志着选项的结束。@trincot,实际上,我没有说我希望调用完全是f3\u提供程序(vars2,degree2)
。我只是不想重复我自己,也不想让电脑重复它自己。现在我相信有一些选择使用部分应用程序或类似的东西,尽管听起来不太令人愉快(至少我不知道如何使其令人愉快)
def f1_provider(vars_, dim1, dim2, dim3):
def f1(*args1):
# ...
# use vars_ and dims
# ...
return f1
def f2_provider(vars_, dim1, dim2, dim3):
def f2(*args2):
# ...
# use vars_ and dims
# ...
return f2
def f3_provider(vars_, dim1, dim2, dim3):
def f3(*args3):
# ...
# use vars_ and dims
# ...
return f3
def general_provider(providers, vars_, degree):
dim1, dim2, dim3 = set_dims(vars_, degree)
return [f_prov(vars_, dim1, dim2, dim3) for f_prov in providers]
# then use them somewhere:
def f1_user():
# ...
f1 = general_provider((f1_provider,), vars1, degree1)
# ...
def f2_f3_user():
# ...
f2, f3 = general_provider((f2_provider, f3_provider), vars2, degree2)
# ...