现在我正在使用闭包来生成像这个简化示例中的函数:
def constant_function(constant):
def dummyfunction(t):
return constant
return dummyfunction
然后将这些生成的函数传递给自定义类的 init 方法,该类将它们存储为实例属性。缺点是这使得类实例不可腌制。所以我想知道是否有一种方法可以创建避免闭包的函数生成器。
您可以使用可调用类:
class ConstantFunction(object):
def __init__(self, constant):
self.constant = constant
def __call__(self, t):
return self.constant
def constant_function(constant):
return ConstantFunction(constant)
然后将函数的关闭状态转移到实例属性。
并不是说我建议将其用于一般用途……但是有另一种编译和编写exec
代码的方法。它正在生成一个没有闭包的函数。
>>> def doit(constant):
... constant = "def constant(t):\n return %s" % constant
... return compile(constant, '<string>', 'exec')
...
>>> exec doit(1)
>>> constant(4)
1
>>> constant
请注意,要在封闭的函数或类中(即不在全局命名空间中)执行此操作,您还必须将适当的命名空间传递给exec
. 请参阅:https ://docs.python.org/2/reference/simple_stmts.html#the-exec-statement
还有双重lambda
方法,这并不是真正的闭包,嗯,有点……
>>> f = lambda x: lambda y:x
>>> g = f(1)
>>> g(4)
1
>>> import dill
>>> _g = dill.dumps(g)
>>> g_ = dill.loads(_g)
>>> g_(5)
1
您似乎担心腌制类似闭包的对象的能力,所以如果您使用dill
. 对于类实例也是如此。