字符串在`eval`语句中被视为变量

时间:2019-04-07 06:40:45

标签: python python-3.x syntax undefined

我正在尝试将字符串变量非常简单地传递到我的eval语句中。但是,我的字符串被视为未定义的变量。

这是我的代码:

condition = 'hi'
print(eval("2 + 4 * len(%s)" % (condition)))

输出:

Traceback (most recent call last):
  File "C:\test.py", line 3, in <module>
    print(eval("4 + 3 * len(%s)" % (condition)))
  File "<string>", line 1, in <module>
NameError: name 'hi' is not defined

但是,当我将hi定义为变量时,代码突然间编译并运行:

condition = 'hi'
hi = 'hi'
print(eval("2 + 4 * len(%s)" % (condition)))

输出:

10

到底是什么?这对我来说似乎完全不直观。有人可以帮我定义condition的方式,而Python也不要求定义'hi'吗?

4 个答案:

答案 0 :(得分:1)

该%s将被hi取代。因此,您要让python运行代码:

eval("2 + 4 * len(hi)")

len(hi)将查找名为“ hi”的变量。您想要的是len('hi')len(condition)。以下是一些可行的替代方法:

# Simplest
print(eval("2 + 4 * len(condition)"))

# Repr gives you the string representation of the object, including quotes
print(eval("2 + 4 * len(%s)" % (repr(condition))))

# Assuming condition doesn't contain '
print(eval("2 + 4 * len('%s')" % (condition))) 

答案 1 :(得分:0)

基本上,您是用“ hi”代替%s。

尝试执行len(hi)将导致与未定义hi相同的NameError异常。

print(eval("2 + 4 * len(\"%s\")" % condition))

将完成这项工作。 screenshot

答案 2 :(得分:0)

您没有将hi作为字符串传递

>>> condition = "'hi'"
>>> print(eval("2 + 4 * len(%s)" % (condition)))
10

答案 3 :(得分:0)

您需要在%s周围加上引号,例如:

condition = 'hi'
print(eval("2 + 4 * len('%s')" % (condition)))

通过这种方式,您将一个字符串“ hi”(而不是变量hi)传递给len()。