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()

実際には、ラムダの実行を自分で制御できないため、次のようなことは言えません。

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

ラムダの実行を制御できる関数にラップして、その単一のラッパー関数のみをホストアプリケーションに渡すことは可能だと思いますが、可能であれば、その追加の間接化を避けたいと思います。

どんな助けでも大歓迎です、ありがとう!

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になります(ypuがきちんとしたい場合は、おそらくそれを関数でラップする必要があります-外部クラスに共有フィールドを直接読み書きするように依頼するのは悪い習慣ですが、私は怠け者です:)「run_lambdas ' ループ アンド リムーブを実行します。

USER ADVISORY - 正確に 1 回実行することによってテストされたコード :)

于 2013-06-10T01:05:37.527 に答える