python / cpython

The Python programming language
https://www.python.org
Other
63.4k stars 30.36k forks source link

pdb's `longlist` shows only decorator if that one contains a lambda #68020

Closed 6c53f22f-246d-4255-aab6-e377bdeb50f4 closed 4 years ago

6c53f22f-246d-4255-aab6-e377bdeb50f4 commented 9 years ago
BPO 23832
Nosy @gerritholl, @pablogsal, @iritkatriel

Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

Show more details

GitHub fields: ```python assignee = None closed_at = created_at = labels = ['type-bug', 'library'] title = "pdb's `longlist` shows only decorator if that one contains a lambda" updated_at = user = 'https://github.com/gerritholl' ``` bugs.python.org fields: ```python activity = actor = 'pablogsal' assignee = 'none' closed = True closed_date = closer = 'pablogsal' components = ['Library (Lib)'] creation = creator = 'Gerrit.Holl' dependencies = [] files = [] hgrepos = [] issue_num = 23832 keywords = [] message_count = 3.0 messages = ['239749', '375776', '375798'] nosy_count = 3.0 nosy_names = ['Gerrit.Holl', 'pablogsal', 'iritkatriel'] pr_nums = [] priority = 'normal' resolution = 'out of date' stage = 'resolved' status = 'closed' superseder = None type = 'behavior' url = 'https://bugs.python.org/issue23832' versions = ['Python 3.4'] ```

6c53f22f-246d-4255-aab6-e377bdeb50f4 commented 9 years ago

When a decorater contains a lambda declaration, using the pdb command longlist will show only the definition of the decorator. The definition of the function itself is not shown:

cat mini.py

!/usr/bin/python3.4

def foo(x, y=None):
    return x

@foo(foo, lambda a:a) def spam(): 0+0 1+1 1/0

spam()
$ python3.4 -mpdb mini.py                                                                                                                                               
> /tmp/mini.py(3)<module>()
-> def foo(x, y=None):
(Pdb) cont
Traceback (most recent call last):
  File "/usr/lib64/python3.4/pdb.py", line 1661, in main
    pdb._runscript(mainpyfile)
  File "/usr/lib64/python3.4/pdb.py", line 1542, in _runscript
    self.run(statement)
  File "/usr/lib64/python3.4/bdb.py", line 431, in run
    exec(cmd, globals, locals)
  File "<string>", line 1, in <module>
  File "/tmp/mini.py", line 3, in <module>
    def foo(x, y=None):
  File "/tmp/mini.py", line 10, in spam
    1/0
ZeroDivisionError: division by zero
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> /tmp/mini.py(10)spam()
-> 1/0
(Pdb) longlist
  6     @foo(foo, lambda a:a)
(Pdb) 

The last line illustrates the problem. longlist should show the definition of spam, not just the decorator.

iritkatriel commented 4 years ago

I think this has been fixed by now, because I don't see the problem in Python 3.10:

python.bat -mpdb tmp1.py
Running Release|Win32 interpreter...
> c:\users\user\src\cpython\tmp1.py(2)<module>()
-> def foo(x, y=None):
(Pdb) c
Traceback (most recent call last):
  File "C:\Users\User\src\cpython\lib\pdb.py", line 1740, in main
    pdb._runscript(mainpyfile)
  File "C:\Users\User\src\cpython\lib\pdb.py", line 1609, in _runscript
    self.run(statement)
  File "C:\Users\User\src\cpython\lib\bdb.py", line 580, in run
    exec(cmd, globals, locals)
  File "<string>", line 1, in <module>
  File "c:\users\user\src\cpython\tmp1.py", line 2, in <module>
    def foo(x, y=None):
  File "c:\users\user\src\cpython\tmp1.py", line 9, in spam
    1/0
ZeroDivisionError: division by zero
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> c:\users\user\src\cpython\tmp1.py(9)spam()
-> 1/0
(Pdb) longlist
  5     @foo(foo, lambda a:a)
  6     def spam():
  7         0+0
  8         1+1
  9  ->     1/0
(Pdb)
iritkatriel commented 4 years ago

pdb uses inspect.findsource for this, where this problem was fixed in bpo-1764286.

I believe this ticket can be closed.