Python eval 函数中的 \r\n 与 \n

5 投票
2 回答
4717 浏览
提问于 2025-04-15 13:16

为什么 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 个回答

1

你是指 eval 还是 exec 呢?请把你运行的代码、完整的错误追踪信息和错误消息都贴出来。

问题可能出在 Python 的语法上,它规定行是由换行符('\n')结束的,而不是两个字符的组合 '\r\n'。

一般来说,最好使用 replace('\r\n', '\n') 来替换,以防里面有重要的 '\r' 字符。如果一开始就没有 '\r' 字符,那就更好了……你是怎么获取这些文本的,是在 Windows 上以二进制方式读取的吗?

说到安全性,你在使用 eval 或 exec 时要小心,特别是当代码来自可能不可信的来源时。

6

你对“工作”的定义有点奇怪:

>>> 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个月内发布——这是一个估计 [有根据的猜测],不是承诺;-)。

撰写回答