我有一个字符串str1 = " 2*PI"
,其中PI是全局字符串PI = "1*pi"
如果我执行eval(str1)
,它将尝试评估1.*pi1.*pi
。如何获得将其评估为2*(1*pi)
即2 pi的值?
答案 0 :(得分:3)
eval(str1)
返回1.*pi1.*pi
,因为eval(str1)
的值为2*"1*pi"
,并且字符串和整数之间的乘法会导致字符串的重复。
直接将字符串格式设置为str1
。
from math import pi
PI = "1*pi"
str1 = f"2*({PI})" # or for versions < Python-3.6: "2*({})".format(PI)
print(str1) # '2*(1*pi)'
print(eval(str1)) # 6.283185307179586
如果您不受PI
的控制,则可以先计算PI
,然后将其格式化为表达式。
eval(f"2*({eval(PI)})") # or equivalently eval("2*({})".format(eval(PI)))
如果您也不控制str1
,则可以用其文字字符串值PI
替换所有1*pi
标记。
eval(str1.replace('PI', PI))
但这不能处理诸如2*PIE
之类的极端情况(如果有的话)。更加健壮的解决方案是使用正则表达式,并在PI
字符周围加上\b
字符以匹配完整的令牌。
import re
eval(re.sub(r'\bPI\b', PI, str1))
这适当地排除了诸如2*PIZZA
或2*API
之类的字符串。
答案 1 :(得分:2)
如果评估-eval()-首先是PI字符串,然后通过str()命令将评估值作为str插入到str1中,然后评估str1
from math import *
PI = "1*pi"
str1 = "2*PI"
PI = str(eval(PI)) # Turns our PI string into a number
str1 = str1.replace("PI",PI) # Sets our PI number in
print(eval(str1)) # Calculates it one last time
输出
6.283185307179586
答案 2 :(得分:1)
感谢先评估似乎已经解决了问题。
所以我现在有
from math import pi
PI = eval("1*pi")
str1 = "2*PI"
eval(str1)
避免了任何替换