散景回调范围

时间:2018-10-24 17:21:36

标签: javascript python

据我所知,在Python中,在函数外部声明的变量可以被后者访问,但不能被修改(除非我们在函数中将其声明为全局变量,请参见https://www.datacamp.com/community/tutorials/scope-of-variables-python)。 / p>

我正在学习使用Bokeh,我想通过回调修改实例(下拉列表,表格...)。根据上一段,如果未将实例声明为全局实例,则回调无法修改这些实例。但是下面的代码示例可以工作...

userList = ['a', 'b', 'c', 'd']
folderList = ['e', 'f', 'g', 'h']
s = MultiSelect(options=userList, size=4, width=1000)
ti = TextInput(placeholder='Enter reference')

def populateDropdown(attr, old, new):
  #nonlocal s, ti
  if new == 0:
    options = userList

  else:
    options =folderList
  s.options = options
  ti.callback = CustomJS(args=dict(options=s.options, s=s),code="s.options = 
options.filter(i =>i[0].toLowerCase().includes(cb_obj.value.toLowerCase()));console.log(options);")

usersFoldersChoice = RadioButtonGroup(labels=["Users", "Folders"])
usersFoldersChoice.on_change('active', populateDropdown)

多重选择已预先填充userlist。有两个单选按钮,如果单击“文件夹”,则会触发回调“ populateDropdown”。此回调必须用s重新填充多选folderList,还必须更新链接到文本输入ti的回调。在这里,sti被修改而没有声明它们是全局的,并且它起作用了,这使我感到困惑。

此外,如果我不明白为什么我必须更新链接到ti的回调以便考虑s的更改(起初,回调直接分配给了ti在其声明期间,但无效...)

谢谢您的澄清!

1 个答案:

答案 0 :(得分:0)

您的直觉并不完全正确。您不能分配功能外的变量。也就是说,此函数不会更新函数外部的.the_champ_sharing_container.the_champ_horizontal_sharing的值:

x

但是,如果函数外部的对象是可变的,即可以“就地”对其进行修改,则通过调用对象上的方法来更新它们是没有问题的。例如:“

x = {}

def f():
    x = [] # this makes a new local variable

这就是为什么Bokeh回调可以操纵在函数外部定义的小部件或数据源对象。

我不太明白你的最后一个问题。