.. _bag_book/trigger_resolver/formula: BagFormula ========== BagFormula ---------- Parliamo ora del metodo ``formula`` che permette di definire all'interno di una bag un particolare tipo di resolver che calcola semplici espressioni tra gli elementi stessi della bag, un po' come si può fare con le formule definite sulle celle di un foglio di calcolo. Il metodo ``formula()`` riceve una stringa contente l'espressione della formula come primo parametro. >>> mybag=Bag({'rect': Bag(), 'polygon': Bag()}) >>> mybag['rect.params.base'] = 20 >>> mybag['rect.params.height'] = 10 >>> mybag['rect.area'] = mybag.formula('$w*$h', w ='params.base', h='params.height') >>> print mybag['rect.area'] 200 ``defineSymbol()`` e ``defineFormula()`` ---------------------------------------- La Bag ha un registro per tutte le formule e i simboli definite definiti. Può essere utile quindi utilizzare questi due metodi. - ``defineSymbol``: definisce una variabile e la collega ad una formula ad un dato path. - ``defineFormula``: definisce una formula che utilizzi le variabili. >>> mybag.defineFormula(calculate_perimeter='2*($base + $height)' ) >>> mybag.defineSymbol(base ='params.base', height='params.height') >>> mybag['rect.perimeter']= mybag.formula('calculate_perimeter') >>> print mybag['rect.perimeter'] 60 >>> mybag.defineFormula(calculate_hypotenuse='(($side1**2)+ ($side2**2))**0.5') >>> mybag.triangle = Bag() >>> mybag['triangle.sides.short'] = 2 >>> mybag['triangle.sides.long'] = 4 >>> mybag['triangle.sides.hypotenuse'] = mybag.formula('calculate_hypotenuse', side1='short', side2='long') >>> print mybag['triangle.sides.hypotenuse'] 4.472135955 Possono essere usati anche path relativi all'interno del namespace definito con defineSymbol e defineFormula. >>> mybag.setBackRef() >>> mybag['polygon.side_number']=5 >>> mybag['polygon.params.side_length']=10 >>> mybag['polygon.calculated.perimeter']= mybag.formula('$num*$length', >>> num='../side_number', >>> length='../params.side_length') >>> print mybag['polygon.calculated.perimeter'] 50 O path assoluti Sometimes is simplier to use absolute path, to bound a variable to its value: >>> mybag['polygon.side_number']=5 >>> mybag['polygon.params.side_length']=10 >>> mybag['polygon.calculated.perimeter']= mybag.formula('$num*$length', >>> num='/polygon/side_number', >>> length='/polygon.params.side_length') >>> print mybag['polygon.calculated.perimeter'] 50 .. sectionauthor:: Giovanni Porcari