1

Python のループの遅延バインディングについては認識していますが、これを解決する方法が見つかりません。

def bind_method(object, methods):

    for method in methods:
        def my_method():
            result = method()

            return result

        setattr(object, method.__name__, my_method)

def test():
    class A: pass

    def bar(): 
        return "BAR"

    def foo(): 
        return "FOO"

    a = A()
    bind_method(a, [bar, foo])

    assert a.foo() == "FOO"
    assert a.bar() == "BAR"


if __name__ == "__main__":
    test()

私はで試してみましたが、成功partialfunctoolsませんでした:(

4

1 に答える 1

1

呼び出しa.bar() my_methodが呼び出され、 for ループが終了したため、 for の値はリストmethodの最後の要素であるため、常に結果として取得されます。methods"FOO"

確認するには、print ステートメントを追加できます。

def my_method():
    print(method.__name__) # this will always print `foo`
    result = method()

しかし、直接設定すると:

def bind_method(object, methods):
    for method in methods:
        setattr(object, method.__name__, method)

それは機能します。


使用functools.partial:

from functools import partial

def bind_method(object, methods):

    for method in methods:
        def my_method(a_method):
            print(a_method.__name__) # this print correct method name
            result = a_method()
            return result

        setattr(object, method.__name__, partial(my_method, method))
于 2016-04-29T14:08:46.477 に答える