Кеширование переменных в функции с Jupyter - PullRequest
1 голос
/ 30 мая 2020

У меня две клетки. В первом я устанавливаю переменную и вызываю функцию, а второй содержит определение функции, в которой используется эта переменная.

Когда я обновляю sh первую ячейку, результат всегда один и тот же, несмотря на значение переменной меняется. Только когда я перезапускаю ячейку с определением функции, выходные данные меняются

In[]:  window=241
       window_t=count_frame_indeces2()
       window_t

Out[]: 241

In[]:  def count_frame_indeces2(window_f=window):
           return window_f

Даже если я изменяю window на 22, выход после повторного запуска этой ячейки по-прежнему 241. Как избежать кэширования переменной в эта функция?

Ответы [ 2 ]

2 голосов
/ 30 мая 2020

Параметры функций по умолчанию оцениваются только во время определения функции. Итак, когда вы запускаете вторую ячейку, window_f получает значение по умолчанию из текущего значения window.

Когда вы запускали вторую ячейку в первый раз, значение window было очевидно 241, так что это то, чем стало значение по умолчанию window_f.

Затем вы меняете значение window и вызываете функцию без параметра, поэтому используется значение по умолчанию (241).

Когда вы запускали вторую ячейку во второй раз, вы снова определили функцию, и она получила новое значение window для своего параметра по умолчанию.

Либо передайте параметр:

window_t=count_frame_indeces2(window)

Или заставьте функцию использовать текущее значение window, если параметр не был передан с:

def count_frame_indeces2(window_f=None):
    if window_f is None:
        window_f = window

    return window_f
0 голосов
/ 30 мая 2020

Я нашел другое решение, используя Facade pattern. Я знаю, что это избыточно, но я не хочу менять определение исходной функции.

def count_frame_indeces2(window_f=window):
    return window_f

def count_frame():
    return count_frame_indeces2(window)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...