Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 干式函数编程:如何避免在不同的高阶函数中出现相同的代码行_Python_Functional Programming_Higher Order Functions - Fatal编程技术网

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中,应该引入一个类,

假设我们有以下设置(让它用Python编写,但语言不是必需的):

如您所见,此设计不太好,至少是因为:

  • 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)
    # ...