ipywidgets
ipywidgets copied to clipboard
button on_click yields UnboundLocalError if variable from parent scope is updated in the function
trafficstars
Description
button on_click yields UnboundLocalError if variable from parent scope is updated in the function
Update: dict variables do not produce the same error
Reproduce
import ipywidgets as widgets
x = 0
y = {"x": 0}
b = widgets.Button(description="Do it")
def doit(obj):
print(x, y)
# x += 1 # uncommenting makes the above print fail
y["x"] += 1 # this is ok
b.on_click(doit)
display(b)
Expected behavior
No error
Context
- ipywidgets version 7.6.5
- Operating System and version: ubuntu 20.04
- Browser and version: firefox
jupyter troubleshoot (on colab)
$PATH:
/usr/local/nvidia/bin
/usr/local/cuda/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/tools/node/bin
/tools/google-cloud-sdk/bin
/opt/bin
sys.path:
/usr/local/bin
/env/python
/usr/lib/python2.7
/usr/lib/python2.7/plat-x86_64-linux-gnu
/usr/lib/python2.7/lib-tk
/usr/lib/python2.7/lib-old
/usr/lib/python2.7/lib-dynload
/usr/local/lib/python2.7/dist-packages
/usr/lib/python2.7/dist-packages
sys.executable:
/usr/bin/python2
sys.version:
2.7.17 (default, Feb 27 2021, 15:10:58)
[GCC 7.5.0]
platform.platform():
Linux-5.4.104+-x86_64-with-Ubuntu-18.04-bionic
which -a jupyter:
/usr/local/bin/jupyter
pip list:
Package Version
---------------------------------- ---------------------
absl-py 0.7.1
aenum 2.2.0
alabaster 0.7.12
albumentations 0.1.12
altair 3.3.0
astor 0.8.1
astropy 2.0.14
atari-py 0.1.7
atomicwrites 1.3.0
attrs 19.1.0
audioread 2.1.8
autograd 1.2
Babel 2.7.0
backports-abc 0.5
backports.functools-lru-cache 1.5
backports.shutil-get-terminal-size 1.0.0
backports.tempfile 1.0
backports.weakref 1.0.post1
bcolz 1.2.1
beautifulsoup4 4.6.3
bleach 3.1.0
blis 0.2.4
bokeh 1.0.4
boto 2.49.0
boto3 1.9.189
botocore 1.12.189
branca 0.3.1
bs4 0.0.1
bz2file 0.98
cachetools 3.1.1
certifi 2019.6.16
cffi 1.12.3
chainer 5.4.0
chardet 3.0.4
Click 7.0
click-plugins 1.1.1
cligj 0.5.0
cloudpickle 1.3.0
cmake 3.12.0
colorlover 0.3.0
community 1.0.0b1
configparser 3.7.4
contextlib2 0.5.5
convertdate 2.1.3
crcmod 1.7
cufflinks 0.14.6
cvxopt 1.2.3
cvxpy 1.0.15
cycler 0.10.0
cymem 2.0.2
Cython 0.29.12
daft 0.0.4
dask 1.1.5
decorator 4.4.0
defusedxml 0.6.0
descartes 1.1.0
dill 0.3.0
distributed 1.25.3
Django 1.11.22
dlib 19.18.0
docutils 0.14
dopamine-rl 1.0.5
easydict 1.9
ecos 2.0.7.post1
editdistance 0.5.3
en-core-web-sm 2.1.0
entrypoints 0.3
enum34 1.1.6
ephem 3.7.6.0
et-xmlfile 1.0.1
fa2 0.3.5
fancyimpute 0.4.3
fastai 0.7.0
fastcache 1.1.0
fastdtw 0.3.2
fastrlock 0.4
fbprophet 0.5
feather-format 0.4.0
featuretools 0.4.1
filelock 3.0.12
Fiona 1.8.6
fix-yahoo-finance 0.0.22
Flask 1.1.1
folium 0.8.3
funcsigs 1.0.2
functools32 3.2.3.post2
future 0.16.0
futures 3.2.0
gast 0.2.2
GDAL 2.2.2
gdown 3.6.4
gensim 3.6.0
geographiclib 1.49
geopandas 0.5.1
geopy 1.17.0
gevent 1.4.0
gin-config 0.2.0
glob2 0.7
google 2.0.2
google-api-core 1.13.0
google-api-python-client 1.7.9
google-auth 1.35.0
google-auth-httplib2 0.0.3
google-auth-oauthlib 0.4.0
google-cloud-bigquery 1.14.0
google-cloud-core 1.0.2
google-cloud-datastore 1.8.0
google-cloud-language 1.2.0
google-cloud-storage 1.16.1
google-cloud-translate 1.5.0
google-colab 1.0.0
google-pasta 0.1.7
google-resumable-media 0.3.2
googleapis-common-protos 1.6.0
googledrivedownloader 0.4
graphviz 0.10.1
greenlet 0.4.15
grpcio 1.15.0
gspread 3.0.1
gspread-dataframe 3.0.2
gunicorn 19.9.0
gym 0.10.11
h5py 2.8.0
HeapDict 1.0.0
holidays 0.9.10
html5lib 1.0.1
httpimport 0.5.16
httplib2 0.11.3
humanize 0.5.1
hyperopt 0.1.2
ideep4py 2.0.0.post3
idna 2.8
image 1.5.27
imageio 2.4.1
imagesize 1.1.0
imbalanced-learn 0.4.3
imblearn 0.0
imgaug 0.2.9
importlib-metadata 1.3.0
imutils 0.5.2
inflect 2.1.0
intel-openmp 2019.0
intervaltree 2.1.0
ipaddress 1.0.22
ipykernel 4.10.1
ipython 5.5.0
ipython-genutils 0.2.0
ipython-sql 0.3.9
ipywidgets 7.5.0
isoweek 1.3.3
itsdangerous 1.1.0
jdcal 1.4.1
jedi 0.14.1
jieba 0.39
Jinja2 2.10.1
jmespath 0.9.4
joblib 0.12.5
jpeg4py 0.1.4
jsonschema 2.6.0
jupyter 1.0.0
jupyter-client 5.3.1
jupyter-console 5.2.0
jupyter-core 4.5.0
kaggle 1.5.4
kapre 0.1.3.1
Keras 2.3.1
Keras-Applications 1.0.8
Keras-Preprocessing 1.1.0
keras-vis 0.4.1
kiwisolver 1.1.0
knnimpute 0.1.0
librosa 0.6.3
lightgbm 2.2.3
llvmlite 0.29.0
lmdb 0.96
lucid 0.3.8
lunardate 0.2.0
lxml 4.2.6
Markdown 3.1.1
MarkupSafe 1.1.1
matplotlib 2.2.4
matplotlib-venn 0.11.5
mesh-tensorflow 0.1.19
mido 1.2.6
mir-eval 0.5
missingno 0.4.2
mistune 0.8.4
mizani 0.4.6
mkl 2019.0
mlxtend 0.14.0
mock 2.0.0
more-itertools 5.0.0
moviepy 0.2.3.5
mpmath 1.1.0
msgpack 0.5.6
multiprocess 0.70.8
multitasking 0.0.9
munch 2.3.2
murmurhash 1.0.2
music21 4.1.0
natsort 5.5.0
nbconvert 5.5.0
nbformat 4.4.0
networkx 2.2
nibabel 2.3.3
nltk 3.2.5
nose 1.3.7
notebook 5.2.2
np-utils 0.5.10.0
numba 0.40.1
numexpr 2.6.9
numpy 1.16.4
oauth2client 4.1.3
oauthlib 3.0.2
okgrade 0.4.3
olefile 0.46
opencv-contrib-python 3.4.3.18
opencv-python 3.4.5.20
openpyxl 2.5.9
opt-einsum 2.3.2
osqp 0.5.0
packaging 19.0
palettable 3.2.0
pandas 0.24.2
pandas-datareader 0.7.0
pandas-gbq 0.4.1
pandas-profiling 1.4.1
pandas-summary 0.0.6
pandocfilters 1.4.2
parso 0.5.1
pathlib 1.0.1
pathlib2 2.3.4
patsy 0.5.1
pbr 5.4.0
pexpect 4.7.0
pickleshare 0.7.5
Pillow 4.3.0
pip 19.3.1
pip-tools 3.9.0
plac 0.9.6
plotly 3.6.1
plotnine 0.4.0
pluggy 0.7.1
portpicker 1.3.9
prefetch-generator 1.0.1
preshed 2.0.1
pretty-midi 0.2.8
prettytable 0.7.2
progressbar2 3.38.0
prometheus-client 0.7.1
promise 2.2.1
prompt-toolkit 1.0.16
protobuf 3.8.0
psutil 5.4.8
psycopg2 2.7.6.1
ptyprocess 0.6.0
py 1.8.0
pyarrow 0.14.0
pyasn1 0.4.5
pyasn1-modules 0.2.5
pycocotools 2.0.0
pycparser 2.19
pydot 1.3.0
pydot-ng 2.0.0
pydotplus 2.0.2
pyemd 0.5.1
pyglet 1.4.1
Pygments 2.1.3
pymc3 3.6
pymongo 3.8.0
pymystem3 0.2.0
PyOpenGL 3.1.0
pyparsing 2.4.0
pyproj 2.2.1
pyrsistent 0.15.4
pysndfile 1.3.3
PySocks 1.7.0
pystan 2.19.0.0
pytest 3.6.4
python-chess 0.23.11
python-dateutil 2.5.3
python-louvain 0.13
python-rtmidi 1.3.0
python-slugify 3.0.2
python-utils 2.3.0
pytz 2018.9
PyWavelets 1.0.3
PyYAML 3.13
pyzmq 19.0.0
qtconsole 4.5.2
QtPy 1.11.2
requests 2.23.0
requests-oauthlib 1.2.0
resampy 0.2.1
retrying 1.3.3
rpy2 2.8.6
rsa 4.0
s3fs 0.2.2
s3transfer 0.2.1
scandir 1.10.0
scikit-image 0.14.3
scikit-learn 0.20.3
scipy 1.2.2
scs 2.1.1.post2
seaborn 0.9.0
semantic-version 2.6.0
Send2Trash 1.5.0
setuptools 44.1.1
setuptools-git 1.2
Shapely 1.6.4.post2
simplegeneric 0.8.1
singledispatch 3.4.0.3
six 1.15.0
sklearn 0.0
sklearn-pandas 1.8.0
smart-open 1.8.4
snowballstemmer 1.9.0
sortedcontainers 2.1.0
spacy 2.1.6
Sphinx 1.8.5
sphinxcontrib-websupport 1.1.2
SQLAlchemy 1.3.5
sqlparse 0.3.0
srsly 0.0.7
statsmodels 0.10.0
subprocess32 3.5.4
sympy 1.1.1
tables 3.4.4
tabulate 0.8.3
tblib 1.4.0
tensor2tensor 1.11.0
tensorboard 2.1.0
tensorboardcolab 0.0.22
tensorflow 2.1.0
tensorflow-estimator 1.15.0
tensorflow-hub 0.5.0
tensorflow-metadata 0.14.0
tensorflow-probability 0.9.0
termcolor 1.1.0
terminado 0.8.2
testpath 0.4.2
text-unidecode 1.2
textblob 0.15.3
tfds-nightly 1.0.2.dev201907170105
Theano 1.0.4
thinc 7.0.8
toolz 0.10.0
torch 1.4.0
torchsummary 1.5.1
torchtext 0.3.1
torchvision 0.5.0
tornado 4.5.3
tqdm 4.28.1
traitlets 4.3.2
tweepy 3.6.0
typing 3.7.4
tzlocal 1.5.1
umap-learn 0.3.9
uritemplate 3.0.0
urllib3 1.24.3
vega-datasets 0.7.0
wasabi 0.2.2
wcwidth 0.1.7
webencodings 0.5.1
Werkzeug 0.15.5
wheel 0.37.0
widgetsnbextension 3.5.0
wordcloud 1.5.0
wrapt 1.11.2
xarray 0.11.3
xgboost 0.82
xlrd 1.1.0
xlwt 1.3.0
yellowbrick 0.9.1
zict 1.0.0
zipp 1.2.0
This is not an issue of ipywidgets, but a general issue with the Python language's scope handling. A fix would be to add nonlocal x to your handler. Details are described in this stackoverflow post.