2017-02-13 88 views
0

我在C#應用程序中使用IronPython來計算表達式。用戶將輸入像如何在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

所以我得到了一個基本的解決方案:將值包裝在一個對象中(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 

您也可以重載其他運營商(子,MUL,DIV等等,包括他們的反面同行)。有關可能的過載,請參閱python docs