同一本书中的相同示例:Python deep nesting factory functions
def maker(N):
def action(X):
return X ** N
return action
我理解它背后的概念,我认为它非常整洁,但我似乎无法想象何时可以使用这种方法。
我可以通过让maker()
将N和X作为参数来轻松实现上述内容。
有没有人使用这种类型的工厂功能并向我解释为什么你采用这种方法而不是仅采取多个参数?
只是用户偏好吗?
答案 0 :(得分:3)
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__
存储值的类。
答案 1 :(得分:1)
在某种程度上,你也可以看到一些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
这常用于e。 G。作为排序函数等的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)
此外,外部函数是一个工厂函数,它创建“真正的装饰”功能。反过来,这甚至会创建另一个替换最初给定的oner。