Python eval函数中的\r\n和\n的区别

4

为什么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上)。现在更清楚了,谢谢大家。


1
请重新考虑执行通过网页表单提供的代码:这样做会在您的系统中创建一个严重的安全漏洞! - Alice Purcell
2个回答

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核心提交者,我认为这是一个小小的设计失误:就像(多余且无用的)空格、制表符和换行符一样,在NEWLINE之前的回车符应该被接受并忽略。我很抱歉:我认为我们从来没有考虑过有人可能想在那里放回车符 - 但是,这样做也没有任何更多的意义,比如换页符,我们也接受它...因此,我看不出拒绝回车符(或其他Unicode非ANSI空格,现在在Python 3中我们接受标识符中任意的Unicode非ANSI字母数字)的理由。
如果您关心,请在Python问题跟踪器上打开一个问题,并且(除非其他提交者有意见)我认为我可以在Python 3.2中修复它(预计在12到18个月内发布 - 这是一个估计[知情猜测],而不是承诺;-)。

1

你是指eval还是exec?请粘贴您运行的确切内容,以及完整的回溯和错误消息。

问题可能是因为Python语法规定行以换行符('\n')终止,而不是两个字符的序列'\r\n'。

一般来说,如果有一个有意义的'\r'在其中某个地方,最好使用replace('\r\n', '\n')。最好在第一次没有'\r'的情况下获取文本...您是如何获取文本的-在Windows框上进行二进制读取吗?

谈到安全性,您应该小心使用eval或exec对来自可能的敌人的任何旧代码进行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接