Python eval 函数中的 \r\n 与 \n
为什么 eval 函数在遇到 \r\n 时不工作,而在遇到 \n 时能正常工作呢?比如说,eval("for i in range(5):\r\n print 'hello'") 这个就不行,而 eval("for i in range(5):\n print 'hello'") 这个就可以。
我知道其实没有什么问题,因为用 replace("\r","") 可以解决这个问题,但有人知道这是为什么吗?
--编辑--
哦!抱歉,我其实是想说 exec。回车符出现是因为我通过 POST 从 HTML 的文本框读取内容(我在用 Linux 系统)。现在清楚多了,谢谢大家。
2 个回答
你是指 eval 还是 exec 呢?请把你运行的代码、完整的错误追踪信息和错误消息都贴出来。
问题可能出在 Python 的语法上,它规定行是由换行符('\n')结束的,而不是两个字符的组合 '\r\n'。
一般来说,最好使用 replace('\r\n', '\n') 来替换,以防里面有重要的 '\r' 字符。如果一开始就没有 '\r' 字符,那就更好了……你是怎么获取这些文本的,是在 Windows 上以二进制方式读取的吗?
说到安全性,你在使用 eval 或 exec 时要小心,特别是当代码来自可能不可信的来源时。
你对“工作”的定义有点奇怪:
>>> eval("for i in range(5):\n print 'hello'")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
for i in range(5):
^
SyntaxError: invalid syntax
>>>
我不太明白你为什么要用 eval
,我猜你是想用 exec
。在Python中,表达式和语句是完全不同的东西——eval
只处理表达式(一个单独的表达式 也是 语句,所以 exec
可以处理它以及其他语句)。
说到 exec
,作为一个Python核心开发者,我觉得这里有个小小的设计问题:就像在换行符之前的多余空格、制表符和换页符会被接受并忽略一样,回车符也应该被接受(虽然它也是多余的和没用的)。我很抱歉,我们从来没有考虑过有人可能 想 在那里放回车符——但这样想也没什么道理,比如换页符在那里也没意义,而我们却接受了 它……所以我觉得没有理由拒绝回车符(或者其他Unicode非ANSI的空白字符,现在在Python 3中,我们在标识符中接受任意Unicode非ANSI的字母数字字符)。
如果你在意的话,请在Python的问题追踪器上提出一个问题,除非其他开发者有不同意见,我想我可以在Python 3.2中解决这个问题(预计在12到18个月内发布——这是一个估计 [有根据的猜测],不是承诺;-)。