同一本书中的相同示例:Python 深度嵌套工厂函数
def maker(N):
def action(X):
return X ** N
return action
我理解它背后的概念,我认为它真的很简洁,但我似乎无法想象何时可以使用这种方法。
maker()
我可以通过将 N 和 X 作为参数来轻松实现上述内容。
有没有人使用这种类型的工厂函数并向我解释你为什么采用这种方法而不是仅仅采用多个参数?
仅仅是用户偏好吗?
同一本书中的相同示例:Python 深度嵌套工厂函数
def maker(N):
def action(X):
return X ** N
return action
我理解它背后的概念,我认为它真的很简洁,但我似乎无法想象何时可以使用这种方法。
maker()
我可以通过将 N 和 X 作为参数来轻松实现上述内容。
有没有人使用这种类型的工厂函数并向我解释你为什么采用这种方法而不是仅仅采用多个参数?
仅仅是用户偏好吗?
squarer = maker(2)
print(squarer(2)) # outputs 4
print(squarer(4)) # outputs 16
print(squarer(8)) # outputs 64
从本质上讲,这意味着您只需输入N
一次值,以后就无法更改。
我认为这主要是编程风格,因为有多种方法可以做同样的事情。但是,通过这种方式,您只能输入N
一次值,因此您可以添加代码来测试它是否是有效值,而不是在每次调用该函数时进行检查。
编辑 只是想到了一个可能的例子(尽管它通常是通过使用一个类来处理的):
writer = connectmaker("127.0.0.1")
writer("send this text")
writer("send this other text")
然后,“maker”方法将连接到该地址一次,然后为每次调用writer()
. 但正如我所说,这样的东西通常是一个__init__
存储值的类。
在某种程度上,您也可以看到其中的一些operator
功能。
例如,operator.itemgetter()
以这种方式工作:
import operator
get1 = operator.itemgetter(1) # creates a function which gets the item #1 of the given object
get1([5,4,3,2,1]) # gives 4
这通常用作例如key=
排序函数等的函数。
如果您有一个可以解决的具体问题,那么很容易想象类似的、更专用的用例。
在同一个联盟中,你有这些“装饰创造者”:
def indirect_deco(outer_param):
def real_deco(func):
def wrapper(*a, **k):
return func(outer_param, *a, **k)
return wrapper
return real_deco
@indirect_deco(1)
def function(a, b, c):
print (((a, b, c))
function(234, 432)
在这里,外部函数也是一个工厂函数,它创建了“真正的装饰”函数。反过来,这甚至会创建另一个替换原来给定的那个。