Python Eval:这段代码出了什么问题?

时间:2009-09-21 20:47:38

标签: python eval syntax-error

我正在尝试编写一个非常简单的Python实用程序供个人使用,它计算文本文件中为命令行指定的谓词为true的行数。这是代码:

import sys

pred = sys.argv[2]
if sys.argv[1] == "stdin" :
    handle = sys.stdin
else :
    handle = open(sys.argv[1])
result = 0
for line in handle :
    eval('result += 1 if ' + pred + ' else 0')
print result

当我使用python count.py myFile.txt "int(line) == 0"运行它时,出现以下错误:

  File "c:/pycode/count.py", line 10, in <module>
    eval('toAdd = 1 if ' + pred + ' else 0')
  File "<string>", line 1
    toAdd = 1 if int(line) == 0 else 0

这看起来对我来说是完全有效的Python代码(虽然我以前从未使用过Python的eval,所以我不知道它的怪癖,如果有的话)。请告诉我如何解决这个问题以使其发挥作用。

5 个答案:

答案 0 :(得分:11)

尝试使用exec而不是eval。解释了2之间的差异here

答案 1 :(得分:5)

尝试:

for line in handle:
  result += 1 if eval(pred) else 0

答案 2 :(得分:3)

#!/usr/bin/env python
import fileinput, sys

pred = eval('lambda line: ' + sys.argv[1])
print sum(1 for line in fileinput.input(sys.argv[2:]) if pred(line))

用法:pywc.py predicate [FILE]...
打印满足predicate(s)FILE的行数 没有FILE,或者当FILE是 - 时,读取标准输入。

答案 3 :(得分:2)

python eval()函数计算表达式而不是语句。尝试用以下代码替换eval()行:

result += eval(pred + " else 0")

答案 4 :(得分:0)

真的,你正在寻找编译功能:

>> a = compile("toAdd = 1 if int('0') == 0 else 0", 'tmp2.py', 'exec')
>>> eval(a)
>>> toAdd
1

eval仅用于表达式...编译时将语句编译成一个可以进行eval的代码块。