为什么eval函数不能与\ r \ n一起使用,而是使用\ n。例如 eval(“for in range(5):\ r \ n print'hello'")不起作用 eval(“for in range(5):\ n print'hello'")有效

我知道没有问题导致使用替换(“\ r”,“"”)更正,但有人知道为什么会发生?

- Edit-- 哦!对不起,确切地说,我的意思是执行官。回车出现是因为我正在通过POST从HTML textarea中读取(我在Linux机器上)。现在更清楚了,感谢大家。

有帮助吗?

解决方案

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

>>> 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个月内修复 - 这是一个估计[知情的猜测],不是承诺; - )。

其他提示

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

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

一般情况下,使用replace('\ r \ n','\ n')会更安全,以防某处存在有意义的'\ r'。如果你首先没有'\ r'那就更好了...你如何获得文本 - 在Windows框中读取二进制文件?

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top