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
Autore della sezione: Giovanni Porcari