Python Decorator как обратный вызов в Dash, использующий объект Dash, который является переменной экземпляра - Сбой - PullRequest
0 голосов
/ 17 февраля 2019

Я обновляю некоторый код, чтобы использовать Dash и плотно.Основной код для построения графиков определяется внутри класса.Я заменил некоторые виджеты Bokeh элементами управления Dash и в результате получил обратный вызов, который выглядит следующим образом:

class MakeStuff:
    def __init__(self, ..., **optional):
        ...
        self.app = dash.Dash(...)
        ...

    @self.app.callback(
    dash.dependencies.Output('indicator-graphic', 'figure'),
        [dash.dependencies.Input('start-time-slider', 'value'),
         dash.dependencies.Input('graph-width-slider', 'value')]
        )
    def update_graphs(self,range_start,graph_width):
        print(...)

Я следую некоторым примерам с сайта Dash .Я смог запустить примеры, в том числе обратные вызовы.В моем коде без декоратора код работает без ошибок, производя графику и элементы управления, как я и ожидал.(Конечно, код неполный, но ошибки нет.) Когда я включаю декоратор, я получаю эту ошибку:

NameError: имя 'self' не определено

Я устал так, во-первых, просто имитируя примеры кода:

class MakeStuff:
    def __init__(self, ..., **optional):
        ...
        app = dash.Dash(...)
        ...

    @app.callback(
    dash.dependencies.Output('indicator-graphic', 'figure'),
    [dash.dependencies.Input('start-time-slider', 'value'),
     dash.dependencies.Input('graph-width-slider', 'value')]
    )
    def update_graphs(self,range_start,graph_width):
        print(...)

Конечно, переменная "app" известна только в рамках init функция, поэтому неудивительно, что это не работает, выдавая похожую ошибку:

NameError: имя 'app' не определено

Есть ли прямой способнастроить этот декоратор для работы, сохраняя при этом мой код в определении класса?Я предполагаю, что некоторая предварительная обработка продолжается с декоратором, но я не понимаю это достаточно хорошо, чтобы найти решение.

1 Ответ

0 голосов
/ 17 февраля 2019

Вы можете вызывать функцию обратного вызова не как декоратор, как показано в этот ответ .Это должно работать изнутри вашей функции init:

class MakeStuff:
    def __init__(self, ..., **optional):
        ...
        self.app = dash.Dash(...)
        app.callback(dash.dependencies.Output('indicator-graphic', 'figure'),
            [dash.dependencies.Input('start-time-slider', 'value'),
             dash.dependencies.Input('graph-width-slider', 'value')])(self.update_graphs)
        ...

    def update_graphs(self,range_start,graph_width):
        print(...)

Я никогда не пробовал его с экземпляром класса раньше, но не вижу причин, по которым он не работает.

...