spyder-ide / spyder

Official repository for Spyder - The Scientific Python Development Environment
https://www.spyder-ide.org
MIT License
8.22k stars 1.59k forks source link

Infinite recursion causes stack overflow instead of RecursionError #18930

Open ncbloch opened 2 years ago

ncbloch commented 2 years ago

Problem Description

If I run the sample code below, I get a stack overflow error and the kernel restarts. IF I run the same code from the command line, I get a RecursionError as expected.

According to this post by dalthviz, this behavior only happens with the default interpreter.

What steps reproduce the problem?

def callA(a):
    a(a)
c = callA(callA)

Expected output


C:\> python .\testcase.py
Traceback (most recent call last):
  File "C:\testcase.py", line 29, in <module>
    aa.sdsd
  File "C:\testcase.py", line 20, in __getattr__
    if (name in self.members.keys()):
  File "C:\testcase.py", line 20, in __getattr__
    if (name in self.members.keys()):
  File "C:\testcase.py", line 20, in __getattr__
    if (name in self.members.keys()):
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded

Actual error (using default interpreter)

Windows fatal exception: stack overflow

Main thread:
Current thread 0x0000e0f8 (most recent call first):
  File "c:\testcase.py", line 20 in __getattr__
  File "c:\testcase.py", line 20 in __getattr__
  File "c:\testcase.py", line 20 in __getattr__
  File "c:\testcase.py", line 20 in __getattr__
  File "c:\testcase.py", line 20 in __getattr__
  File "c:\testcase.py", line 20 in __getattr__
  File "c:\testcase.py", line 20 in __getattr__
  File "c:\testcase.py", line 20 in __getattr__
  File "c:\testcase.py", line 20 in __getattr__
  File "c:\testcase.py", line 20 in __getattr__
  File "c:\testcase.py", line 20 in __getattr__
  File "c:\testcase.py", line 20 in __getattr__
  File "c:\testcase.py", line 20 in __getattr__
  File "c:\testcase.py", line 20 in __getattr__
  File "c:\testcase.py", line 20 in __getattr__
  File "c:\testcase.py", line 20 in __getattr__
  ...

Restarting kernel...

Versions

Dependencies


# Mandatory:
atomicwrites >=1.2.0          :  1.4.0 (OK)
chardet >=2.0.0               :  4.0.0 (OK)
cloudpickle >=0.5.0           :  2.0.0 (OK)
cookiecutter >=1.6.0          :  1.7.2 (OK)
diff_match_patch >=20181111   :  20200713 (OK)
intervaltree >=3.0.2          :  3.1.0 (OK)
IPython >=7.6.0               :  7.32.0 (OK)
jedi >=0.17.2;<0.19.0         :  0.18.1 (OK)
jsonschema >=3.2.0            :  3.2.0 (OK)
keyring >=17.0.0              :  23.1.0 (OK)
nbconvert >=4.0               :  6.1.0 (OK)
numpydoc >=0.6.0              :  1.1.0 (OK)
paramiko >=2.4.0              :  2.7.2 (OK)
parso >=0.7.0;<0.9.0          :  0.8.3 (OK)
pexpect >=4.4.0               :  4.8.0 (OK)
pickleshare >=0.4             :  0.7.5 (OK)
psutil >=5.3                  :  5.8.0 (OK)
pygments >=2.0                :  2.10.0 (OK)
pylint >=2.5.0;<2.10.0        :  2.9.6 (OK)
pyls_spyder >=0.4.0           :  0.4.0 (OK)
pylsp >=1.2.2;<1.3.0          :  1.2.4 (OK)
pylsp_black >=1.0.0           :  None (OK)
qdarkstyle =3.0.2             :  3.0.2 (OK)
qstylizer >=0.1.10            :  0.1.10 (OK)
qtawesome >=1.0.2             :  1.0.2 (OK)
qtconsole >=5.1.0             :  5.1.1 (OK)
qtpy >=1.5.0                  :  1.10.0 (OK)
rtree >=0.9.7                 :  0.9.7 (OK)
setuptools >=49.6.0           :  58.0.4 (OK)
sphinx >=0.6.6                :  4.2.0 (OK)
spyder_kernels >=2.1.1;<2.2.0 :  2.1.3 (OK)
textdistance >=4.2.0          :  4.2.1 (OK)
three_merge >=0.1.1           :  0.1.1 (OK)
watchdog >=0.10.3             :  2.1.3 (OK)
zmq >=17                      :  22.2.1 (OK)

# Optional:
cython >=0.21                 :  0.29.24 (OK)
matplotlib >=2.0.0            :  3.4.1 (OK)
numpy >=1.7                   :  1.21.2 (OK)
pandas >=1.1.1                :  1.3.4 (OK)
scipy >=0.17.0                :  1.6.2 (OK)
sympy >=0.7.3                 :  1.9 (OK)
ccordoba12 commented 2 years ago

This error was reported a couple of months ago and a user confirmed that it also happens in Jupyter notebook and Lab, meaning that we can't solve it here. That's because we use the same architecture as Jupyter to run code, so the problem needs to be addressed there (perhaps in Jupyter-client or IPykernel).

However, we'll leave this issue open in case other users report the same problem in the future.