繁体   English   中英

在python中生成没有闭包的函数

[英]Generate functions without closures in python

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

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 ,你甚至可以看到双羔羊是可腌制的。 类实例也是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM