jupyter-widgets / ipywidgets

Interactive Widgets for the Jupyter Notebook
https://ipywidgets.readthedocs.io
BSD 3-Clause "New" or "Revised" License
3.16k stars 950 forks source link

button on_click yields UnboundLocalError if variable from parent scope is updated in the function #3292

Open shadiakiki1986 opened 3 years ago

shadiakiki1986 commented 3 years ago

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

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
dokempf commented 2 years ago

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.