1

我把自己弄糊涂了,以至于我需要帮助:

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

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 的执行包装在一个我可以控制的函数中,并且只将那个单一的包装函数传递给主机应用程序,但如果可能的话,我想避免这种额外的间接。

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

4

1 回答 1

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(如果您想要整洁,您可能应该将其包装在一个函数中 - 要求外部类直接读取和写入共享字段是不好的做法,但我很懒 :) 'run_lambdas ' 将执行循环和删除。

用户建议 - 通过只运行一次来​​测试代码 :)

于 2013-06-10T01:05:37.527 回答