Python:从lambda闭包列表中删除

时间:2013-06-09 23:47:12

标签: python list lambda closures

我让自己感到困惑,直到我需要帮助:

假设我有一个要执行的闭包列表。在执行这样的闭包时,如果满足某个条件,我希望它从列表中删除它自己。请考虑以下事项:

my_lambdas = []

def some_condition_is_met(n): return n > 5

def my_function(n):
    if some_condition_is_met(n):
        # Remove me from my_lambdas, but how?
        return False
    print(n)
    return True

def make_me_a_lambda(n):
    # Alternatively do removal based on the return value:
    return lambda: my_function(n) or remove_me_but_how() 

my_lambdas.append(make_me_a_lambda(1))
my_lambdas.append(make_me_a_lambda(7))

for l in my_lambdas: l()

实际上我自己无法控制lambdas的执行,所以我不能说:

my_lambdas = [l for l in my_lambdas if l()]

虽然我想可以将lambdas的执行包装在一个函数中,但我确实可以控制并将该单个包装器函数传递给宿主应用程序,如果可能的话,我想避免这种额外的间接。 / p>

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

你可以像这样构建它:

delenda = []
for l in my_lambdas:
   if not l(): delenda.append(l)
for item in in delenda:
   my_lambdas.remove(item)

并且只使用返回值的真实性来删除执行时的项目?

或者,您是否可以传递知道如何从注册表中删除自己的可调用类实例?

from functools import partial

class Deleteme (object):
    REGISTRY = []
    def __init__(self, func, *args):
        self.callable = partial(func, *args)

    def register(self):
        if not self in self.REGISTRY: self.REGISTRY.append(self)

    def __call__(self):
        retval = self.callable()
        if not retval and self in self.REGISTRY:
            self.REGISTRY.remove(self)
        return retval

    @classmethod
    def run_lambdas(cls):
        for lmb in [i for i in cls.REGISTRY] :
            yield lmb()


test1 = Deleteme (lambda q: q > 5, 3)
test2 = Deleteme (lambda q: q > 5, 6)
test3 = Deleteme (lambda q: q > 5, -1)
test1.register()
test2.register()
test3.register()

for item in Deleteme.run_lambdas():
    print item

print Deleteme.REGISTRY
>False
>True
>False
>[<__main__.Deleteme object at 0x00000000026A0048>]  #note only one left in the list

你的'my_lambdas'将是Deletem.REGISTRY(如果ypu想要整洁你应该将它包装在一个函数中 - 要求外部类直接读取和写入共享字段是Bad Practice,但我很懒: )'run_lambdas'将执行循环删除。

USER ADVISORY - 通过运行一次测试代码:)