我正在编写一个Python库,该库使用Bokeh生成交互式可视化图像。我发现自己正在构造大量的小部件,并且想知道一种更有效的方式来构造我的代码。考虑下面的最小示例(我以面向对象的方式编写,这是我的类方法之一):
from bokeh.models.widgets.buttons import Button
from bokeh.models.widgets import Slider
# ...
def _generate_widgets(self):
"""
Generates the widget instances used for user interaction.
"""
self.widget_names = ['start', 'change', 'do_something']
self.widget_types = {'start':Button,
'change':Slider,
'do_something':Button}
self.widget_args = {'start':{'label':'Start!',
'width':200}},
'change':{'title':'Change value:',
'width':200,
'value':500,
'start':0,
'end':1000,
'step':50},
'do_something':{'label':'Do Something!'}}
self.widget_callbacks = {'start':self._start_callback,
'change':None,
'do_something':self_do_callback}
# make the widgets
self.widgets = {}
for widget_name in self.widget_names:
widget = self.widget_types[widget_name](**self.widget_args[widget_name])
self.widgets[widget_name] = widget
然后我再分配回调。在这个小例子中,它还不错,但是当我有大量的小部件(例如5个以上)时,存储小部件属性的字典会变得很大,并且我要重复很多代码(小部件名称)。这种方法的一个优点是它使我可以轻松地添加/删除小部件,而不必担心字典中的顺序。但是我想知道是否有一种更有效的方式编写此代码?
例如,我的一个主意是制作一个按钮构造函数并将信息存储在列表中。
TLDR:人们通常如何处理大量参数的硬编码以制成相似的对象?
答案 0 :(得分:1)
除了具有三个属性来存储有关小部件的信息之外,您可以使用具有以下信息的元组列表:
widget_definitions = [
('start', Button, { <start button kwargs> }, self._start_callback),
('change', Slider, { <change slider kwargs> }, None),
('do_something', Button, { <do something kwargs>, self._do_something)
]
或者,您可以从小部件名称到其他属性只有一个字典。
widget_definitions = {
'start': (Button, { <start button kwargs> }, self._start_callback),
'change': (Slider, { <change slider kwargs> }, None),
'do_something': (Button, { <do something kwargs> }, self._do_something)
}
这里的主要好处不是运行时效率,而是每个小部件定义都是独立的。