Timothy Geiser <slimshady...@inbox.lv> added the comment:
It looks like the IDLE debugger seems to call repr on objects to present in the Locals list, even before they've been properly initialized. If __repr__ needs to refer to variables that don't exist until __init__ is done (and I don't think it's unreasonable for __repr__ to assume that __init__ is indeed finished), the debugger either needs wait until __init__ has completed on any given instance before trying to repr it, or otherwise needs to catch a potentially very wide range of exceptions that might be raised from calling __repr__ so early. I prefer the latter solution, since any buggy code that (effectively) crashes on it's __repr__ (for whatever reason) will probably bring the debugger to it's knees. I played around with pdb directly and can sort of get the same thing if I ask for __repr__ too early: 1 Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32 2 Type "help", "copyright", "credits" or "license" for more information. 3 >>> import data 4 >>> import pdb 5 >>> pdb.run("data.BinaryData(b'some data')") 6 > <string>(1)<module>() 7 (Pdb) step 8 --Call-- 9 > c:\users\geitd\documents\python\data.py(4)__init__() 10 -> def __init__(self, data): 11 (Pdb) p self 12 (Pdb) p BinaryData.__repr__(self) 13 *** AttributeError: 'BinaryData' object has no attribute 'length' 14 (Pdb) step 15 > c:\users\geitd\documents\python\data.py(5)__init__() 16 -> if not data: 17 (Pdb) step 18 > c:\users\geitd\documents\python\data.py(7)__init__() 19 -> if len(data) <= 1: 20 (Pdb) step 21 > c:\users\geitd\documents\python\data.py(10)__init__() 22 -> self.data = data 23 (Pdb) step 24 > c:\users\geitd\documents\python\data.py(11)__init__() 25 -> self.length = len(data) 26 (Pdb) p self 27 (Pdb) p BinaryData.__repr__(self) 28 *** AttributeError: 'BinaryData' object has no attribute 'length' 29 (Pdb) step 30 --Return-- 31 > c:\users\geitd\documents\python\data.py(11)__init__()->None 32 -> self.length = len(data) 33 (Pdb) p self 34 <BinaryData: length 9> 35 (Pdb) p BinaryData.__repr__(self) 36 '<BinaryData: length 9>' Note that line 11 didn't return anything, but didn't have any bad results, whereas the way I phrased line 12 gave the exact same error the IDLE debugger threw. Lines 26 and 27 towards the end of __init__ came out the same, but after the --Return-- on 30, either phrasing gives what you'd expect. I suppose the TL;DR is to take the mechanism that gives the correct behavior of 'p self' in pdb and copy it over to the IDLE debugger (or whatever other mechanism is necessary). Is this enough for you to work from? ---------- Added file: https://bugs.python.org/file49082/data.py _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue33065> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com