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

4

2 回答 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 个月内发布 - 这是一个估计 [知情猜测],不是承诺;-)。

于 2009-07-30T04:37:45.783 回答
1

你的意思是eval还是exec?请准确发布您运行的内容,以及完整的回溯和错误消息。

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

一般来说,如果某处有有意义的 '\r' ,则使用 replace('\r\n', '\n') 会更安全。如果你一开始就没有'\r'会更好......你是如何获得文本的——在Windows机器上读取二进制文件?

谈到安全性,你应该小心对从可能的敌人那里获得的任何旧代码使用 eval 或 exec。

于 2009-07-30T04:03:51.987 回答