Python Ipywidgets: как узнать, какой параметр изменился при запуске `interactive`? - PullRequest
0 голосов
/ 17 февраля 2020

Я борюсь с 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'. Как это может случиться? И как это предотвратить?

...