[Python-Dev] Avoiding error from repr() of recursive dictview

Jan Kaliszewski zuo at chopin.edu.pl
Tue Jul 23 00:30:12 CEST 2013


23.07.2013 00:01, Gregory P. Smith wrote:

> On Mon, Jul 22, 2013 at 2:44 PM, Ben North <ben at redfrontdoor.org> 
> wrote:
>
>> A friend of mine, Ruadhan O'Flanagan, came across a bug which turned 
>> out
>> to be the one noted in [http://bugs.python.org/issue18019 [1]], 
>> i.e.:
>>
>> >>> d={}
>> >>> d[42]=d.viewvalues()
>> >>> d
>> <segmentation fault>
>>
>> This issue has been fixed in hg; the behaviour now is that a
>> RuntimeError is produced for a recursive dictionary view:
>>
>> >>> d={}
>> >>> d[42]=d.viewvalues()
>> >>> d # (output line-broken:)
>> {42: Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>> RuntimeError: maximum recursion depth exceeded
>>   while getting the repr of a list
>>
>> Before finding this, though, I'd investigated and made a patch which
>> produces a similar "..." output to a recursive dictionary. 
>>  Reworking
>> against current 2.7, the behaviour would be:
>>
>> >>> x={}
>> >>> x[42]=x
>> >>> x # existing behaviour for dictionaries:
>> {42: {...}}
>>
>> >>> d={}
>> >>> d[42]=d.viewvalues()
>> >>> d # new behaviour:
>> {42: dict_values([...])}
>> >>> d[43]=d.viewitems()
>> >>> d # (output line-broken:)
>> {42: dict_values([..., dict_items([(42, ...), (43, ...)])]),
>>  43: dict_items([(42, dict_values([..., ...])), (43, ...)])}
>>
>> Attached is the patch, against current 2.7 branch.  If there is 
>> interest
>> in applying this, I will create a proper patch (changelog entry, fix 
>> to
>> Lib/test/test_dictviews.py, etc.).
>
> Mailing lists are where patches go to get lost and die. :)  Post it
> on an issue on bugs.python.org [4].  Given that the RuntimeError fix
> has been released, your proposed ... behavior is arguably a new
> feature so I'd only expect this to make sense for consideration in
> 3.4, not 2.7.  (if accepted at all)

IMHO it's still a bug (even though not so painful as segfault) that 
should also be fixed in 2.7 and 3.2/3.3.

In other cases (such as `d={}; d[42]=d; repr(d)`) Python does its best 
to avoid an error -- why in this case (`d={}; 
d[42]=d.<Py2.x:view>values(); repr(d)`) should it raise an exception? 
IMHO it's an obvious oversight in implementation, not a feature that 
anybody would expect.

Regards.
*j



More information about the Python-Dev mailing list