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