[Python-ideas] reprs of recursive datastructures.

Terry Reedy tjreedy at udel.edu
Sat Sep 8 00:07:37 CEST 2012


On 9/7/2012 5:57 PM, Terry Reedy wrote:
> On 9/7/2012 3:51 PM, Mike Graham wrote:
>> With the Python 3 loosening of where ... can occur, this somewhat
>> suboptimal behaviour occurs
>>
>>>>> x = []
>>>>> x.append(x)
>>>>> x
>> [[...]]
>>>>> eval(repr(x))
>> [[Ellipsis]]
>
> I believe ... was used for representations before it became Ellipsis
> literal. In any case, the representation is now ambiguous. It is not
> possible to reliably invert a many-to-one function.
>
>> Is this something that can be improved?
>
> Change the recursive substitution so there is no ambiguity. For
> instance, use the unicode ellipsis character instead of '...', Since the
> output is unicode and may contain non-ascii chars anyway, that might be
> considered.
>  >>> '\u2026'
> '…'
>  >>> [[...]]
> [[Ellipsis]]
>  >>> [[…]]
> SyntaxError: invalid character in identifier
>
> If not that, pick anything else giving a syntax error.
>  >>> [[,,,]]
> SyntaxError: invalid syntax
>  >>> [[. . .]]
> SyntaxError: invalid syntax

Or probably the simplest, just use 4 periods
 >>> [[....]]
SyntaxError: invalid syntax

>
>> Is it something worth improving?
>
> I think so. Ambiguity is bad, and the substituted representation is
> something of a fib, so it should not mimic something that is valid.
> eval(representation of recursive structure) should either correctly
> evaluate by re-creating the recursive structure represented* or it
> should raise an error.
>
> * That would mean that the same expression should be valid in code also.
> An interesting idea, and a deep can of worms. I believe it would require
> that '. . .' or whatever be recognizable syntax but not a named object,
> as the latter would re-introduce the same ambiguity.
>


-- 
Terry Jan Reedy





More information about the Python-ideas mailing list