[Pythonmac-SIG] \r in string causes eval to fail
Chris Ryland
cpr at emsoftware.com
Wed Sep 15 03:38:05 CEST 2004
On Sep 11, 2004, at 1:23 PM, Kevin Altis wrote:
> On Sep 10, 2004, at 11:41 AM, Bob Ippolito wrote:
>
>>
>> On Sep 10, 2004, at 2:25 PM, Kevin Altis wrote:
>>
>>> I've run into a problem with eval on the Mac and I'm not sure
>>> whether it is a bug or expected behavior. The problem is that if \r
>>> is used as the line terminator instead of \n then it causes eval to
>>> fail. I ran into this while copying and pasting some text to eval
>>> and the clipboard had converted my newlines to returns. Here is an
>>> example done in the shell. As you can see below, using newlines as a
>>> separator is fine, but return (\r) isn't. This would probably only
>>> come up on the Mac where return (CR, \r) is the default line
>>> terminator, but I didn't know whether universal newlines support was
>>> supposed to deal with this kind of issue.
>>>
>>> >>> s = """{'type':'Button',\r'name':'Button1',\r'position':(10,
>>> 10),\r'label':'Button1',\r}"""
>>> >>> s2 = s.replace('\r', '\n')
>>> >>> eval(s2)
>>
>> "Universal newlines" is only a mode for the file object (as far as I
>> know anyway). eval and compile take strings.
>>
>> It would be a lot more portable to do this to normalize your input
>> strings:
>>
>> '\n'.join(s.splitlines())
>>
>> splitlines is essentially universal newlines support at the string
>> level. It might be smart to do this internally, maybe this deserves
>> a feature request or bug report?
>>
> I double-checked and eval doesn't like \r\n line endings either as you
> would get on Windows, so the behavior is consistent. It might be a
> good idea to have line endings dealt with automatically with compile,
> eval, exec, etc. but this would need to be brought up on python-dev.
> My guess is that there are a lot of places in the language and
> standard libs where the input arg is supposed to be a string using
> linefeeds as the line terminator, so it would be difficult to find and
> handle all the cases.
Argh, this really seems like a basic bug in all versions of CPython.
Eval/exec/parse should support all forms of linefeeds--what's the
downside?
Cheers!
--Chris Ryland / Em Software, Inc. / www.emsoftware.com
More information about the Pythonmac-SIG
mailing list