6

现在我正在使用闭包来生成像这个简化示例中的函数:

def constant_function(constant):
    def dummyfunction(t):
        return constant
    return dummyfunction

然后将这些生成的函数传递给自定义类的 init 方法,该类将它们存储为实例属性。缺点是这使得类实例不可腌制。所以我想知道是否有一种方法可以创建避免闭包的函数生成器。

4

2 回答 2

7

您可以使用可调用类:

class ConstantFunction(object):
    def __init__(self, constant):
        self.constant = constant
    def __call__(self, t):
        return self.constant

def constant_function(constant):
    return ConstantFunction(constant)

然后将函数的关闭状态转移到实例属性。

于 2013-02-22T16:31:21.377 回答
0

并不是说我建议将其用于一般用途……但是有另一种编译和编写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. 对于类实例也是如此。

于 2015-08-09T18:32:29.807 回答