[英]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.