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

发布于 2024-08-05 20:42:50 字数 679 浏览 4 评论 0原文

我正在尝试编写一个非常简单的供个人使用的 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,所以我不知道它有什么怪癖(如果有的话)。请告诉我如何解决这个问题以使其正常工作。

I'm trying to write a very simple Python utility for personal use that counts the number of lines in a text file for which a predicate specified at the command line is true. Here's the code:

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

When I run it using python count.py myFile.txt "int(line) == 0", I get the following error:

  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

This looks like perfectly valid Python code to me (though I've never used Python's eval before, so I don't know what its quirks, if any, are). Please tell me how I can fix this to make it work.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

无名指的心愿 2024-08-12 20:42:50

尝试使用 exec 而不是 eval。 此处解释了两者之间的区别

Try using exec instead of eval. The difference between the 2 is explained here

回眸一笑 2024-08-12 20:42:50

尝试:

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

try:

for line in handle:
  result += 1 if eval(pred) else 0
三人与歌 2024-08-12 20:42:50
#!/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 谓词 [FILE]...
打印给定FILE满足谓词的行数。
没有 FILE 或 FILE 为 - 时,读取标准输入。

#!/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))

Usage: pywc.py predicate [FILE]...
Print number of lines that satisfy predicate for given FILE(s).
With no FILE, or when FILE is -, read standard input.

许你一世情深 2024-08-12 20:42:50

python eval() 函数计算表达式,而不是语句。尝试将 eval() 行替换为:

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

The python eval() function evaluates expressions, not statements. Try replacing the eval() line with:

result += eval(pred + " else 0")
庆幸我还是我 2024-08-12 20:42:50

实际上,您正在寻找compile 函数:

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

eval 仅适用于表达式...compile while 将语句序列编译成代码块,然后可以对其进行eval'ed。

Really, you are looking for the compile function:

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

eval is intended only for expressions... compile while compile sequence of statements into a codeblock that can then be eval'ed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文