KevinScript icon indicating copy to clipboard operation
KevinScript copied to clipboard

Printing fails for self-referential lists

Open kms70847 opened this issue 9 years ago • 1 comments

If a list contains itself, trying to print it produces 40+ error messages, instead of something more sensible.

Input:

>>> seq = [1,2,3];
>>> seq.append(seq);
>>> print(seq);

Expected output:

[1, 2, 3, [...]]

Actual output:

Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (46, 953)
Couldn't call function on line (1, 0)
maximum recursion depth exceeded in cmp

kms70847 avatar Mar 13 '15 16:03 kms70847

This could be solved by keeping a set of "seen" object ids as you iterate down the repr chain. Not sure if this can be done natively, though.

CPython appears to use an external per-thread global dict for this. See https://hg.python.org/cpython/file/03c65fc349c0/Objects/object.c#l2358.

kms70847 avatar Mar 13 '15 17:03 kms70847