我在C#应用程序中使用IronPython来计算表达式。用户将输入类似
的表达式A + B + C
然后我执行python脚本来进行计算:
def main():
return (A + B + C)
main()
如何生成一个运行总计,在执行计算时显示值?所以对于这些输入:
A = 1
B = 2
C = 3
我想要这个输出:
A: 1
B: 3
C: 6
目前我正在使用正则表达式来提取组件并尝试逐步手动执行计算,但是当使用括号时或者当运算符优先级导致表达式开始在另一个点计算时,它会变得混乱。 A + B + C * D / E
我认为运营商重载将是最佳选择。我知道如何在C#中做到这一点,但python对我来说仍然是一个新手。任何建议将不胜感激!
答案 0 :(得分:0)
所以我得到了一个基本的解决方案:将值包装在一个对象(MagicNumber
)中,这会使算术运算符重载。
RunningTotal = {}
class MagicNumber(object):
def __init__(self, name, value):
self.name = str(name)
if isinstance(value, MagicNumber):
value = value.value
self.value = float(value)
def __str__(self):
return str(self.value)
def __add__(self, other):
if not isinstance(other, MagicNumber):
other = MagicNumber('literal', float(other))
result = MagicNumber(self.name, self.value + other.value)
RunningTotal[other.name] = result.value
return result
def __radd__(self, other):
if not isinstance(other, MagicNumber):
other = MagicNumber('literal', float(other))
result = MagicNumber(self.name, other.value + self.value)
RunningTotal[self.name] = result.value
return result
所以当你像这样使用它时:
A = MagicNumber('A', 1)
B = MagicNumber('B', 2)
C = MagicNumber('C', 3)
result = A + B + C
您在RunningTotal词典中获取这些值:
B: 3
C: 6
您还可以重载其他运算符(sub,mul,div等,包括它们的反向运算符)。有关可能的重载,请参阅python docs。