gpt4 book ai didi

Python 装饰器作为 Dash 中的回调使用作为实例变量的 Dash 对象 - 失败

转载 作者:行者123 更新时间:2023-12-02 09:28:21 26 4
gpt4 key购买 nike

我正在更新一些代码以使用 Dash 和plotly。绘图的主要代码是在类中定义的。我用 Dash 控件替换了一些 Bokeh 小部件,最终得到了如下所示的回调:

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 website 中的一些示例。我能够运行这些示例,包括回调。在我的代码中,如果没有装饰器,代码运行时不会出错,并按照我的预期生成图形和控件。 (当然,代码不完整,但没有错误。)当我包含装饰器时,出现此错误:

NameError: name 'self' is not defined

我厌倦了这种方式,首先,只是模仿代码示例:

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: name 'app' is not defined

有没有一种简单的方法可以设置这个装饰器来工作,同时仍然将我的代码保留在类定义中?我猜测装饰器正在进行一些预处理,但我对它的理解还不够深入,无法提出解决方案。

最佳答案

您可以不将回调函数作为装饰器来调用,如this answer所示。这应该在您的 __init__ 函数中起作用:

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')]
)(self.update_graphs)
...

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

我以前从未尝试过使用类实例,但没有理由认为它不起作用。

关于Python 装饰器作为 Dash 中的回调使用作为实例变量的 Dash 对象 - 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54729529/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com