Я борюсь с ipywidgets. В моей функции, которая называется интерактивно, есть дорогая (в смысле времени выполнения) подфункция. Так что я хотел бы вызывать дорогую функцию только при изменении указанного параметра c, а не при любом изменении какого-либо параметра. Как это можно сделать эффективно?
Я нашел решение с imo неуклюжим, потому что 1. каждый виджет (в моем реальном приложении >> 2) должен отображаться отдельно, 2. каждый виджет нуждается его спецификация .observe()
, 3. функции должны быть изменены.
# setup
import ipywidgets as widgets
import time
geo = {'USA': ['CHI', 'NYC'], 'Russia': ['MOW', 'LED']}
########### current approach
def main_function(city, country):
expensive_function(country) # should only be called, when country changes
print (f'{city} is a city in {country}')
def expensive_function(country):
print('expensive part')
time.sleep(5)
cityW.options = geo[country]
countryW = widgets.Select(options=geo.keys())
cityW = widgets.Select(options=geo['USA'])
widgets.interactive(main_function, city=cityW, country=countryW)
########### clumsy solution
def main_function(change):
if change['type'] == 'change' and change['name'] == 'value':
print (f'{cityW.value} is a city in {countryW.value}')
def expensive_function(change):
if change['type'] == 'change' and change['name'] == 'value':
print('loading data')
time.sleep(5)
cityW.options = tuple(geo[countryW.value])
countryW = widgets.Select(options=geo.keys())
cityW = widgets.Select(options=geo['USA'])
cityW.observe(main_function)
countryW.observe(expensive_function)
display(countryW)
display(cityW)
Бонусные вопросы: вывод текущего подхода включает 'NYC is a city in Russia'
. Как это может случиться? И как это предотвратить?