Динамически изменять методы, вызываемые в замыкании - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь решить сложную проблему, которую не знаю, как решить в python изящным способом.

Допустим, у меня есть класс с добавленной функцией:

class A(object):
    def __init__(self, fn):
        self.fn = fn #assuming fn is from int to int

Допустим, я также создаю оболочку:

class A_twice(object):
    def __init__(self, a_instance):
        def do_twice(x):
            return a_instance.fn(x) + a_instance.fn(x)
        self.fn = do_twice

Предположим, я создаю вторую оболочку вокруг A:

class A_with_storage(object):
    def __init__(self, a_instance):
        def fn_store_output(x, list_):
            value = a_instance.fn(x)
            list_.append(value)
            return value
        self.fn_with_storage = fn_store_output

Я могу сделатьследующее:

a = A(lambda x : x*x)
a.fn(3) #9
a_twice = A_twice(a)
a_twice.fn(3) #18
a_stored = A_with_storage(a)
l = []
a_stored.fn_with_storage(3, l)
#l = [9]
a_twice_stored = A_with_storage(a_twice)
l2 = []
a_twice_stored.fn_with_storage(3,l2)
#l2 = [18]

Как мы видим, fn_with_storage упаковывает вызов в fn, но не включает "внутренние" вызовы внутреннего fn, выполняемые начальным fn.Есть ли способ сделать это?Мне нужен «волшебный» способ определить A_with_storage так, чтобы:

a_twice_stored = A_with_storage(a_twice)
l2 = []
a_twice_stored.fn_with_storage(3,l2)
#l2 = [9,9,18]

, т. Е. Обертка «хранилище» автоматически применялась ко всем вызовам «fn», выполняемым внутри каждого замыкания.Возможно ли это как-то?если возможно, я могу пометить каждую функцию fn декоратором или что-то в этом роде

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...