Changeset 1623

Show
Ignore:
Timestamp:
07/12/07 00:06:57 (1 year ago)
Author:
arj..@yirdis.nl
Message:

Added recursion decorator. implemented them on constraints.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • gaphas/branches/hw/gaphas/constraint.py

    r1618 r1623  
    2323       is kept to a minimum 
    2424""" 
     25 
     26__version__ = "$Revision$" 
     27# $HeadURL$ 
     28 
     29 
    2530from __future__ import division 
    2631import operator 
    27  
    28 __version__ = "$Revision$" 
    29 # $HeadURL$ 
     32from decorators import recursive 
     33 
    3034 
    3135class Constraint(object): 
     
    117121        self.b = b 
    118122 
     123    @recursive(limit=5) 
    119124    def solve_for(self, var): 
    120125        assert var in (self.a, self.b) 
     
    155160        self.center = center 
    156161 
     162    @recursive(limit=5) 
    157163    def solve_for(self, var): 
    158164        assert var in (self.a, self.b, self.center) 
     
    192198        self.delta = delta 
    193199 
     200    @recursive(limit=5) 
    194201    def solve_for(self, var): 
    195202        if self.smaller.value > self.bigger.value - self.delta: 
     
    277284 
    278285 
     286    @recursive(limit=5) 
    279287    def solve_for(self, var): 
    280288        """ 
     
    378386        print 'b', self.balance 
    379387 
     388    @recursive(limit=5) 
    380389    def solve_for(self, var): 
    381390        b1, b2 = self.band 
     
    424433 
    425434 
     435    @recursive(limit=5) 
    426436    def solve_for(self, var): 
    427437        b1, b2 = self.band 
    428438        w = b2 - b1 
    429         var.value = b1 + w * self.balance 
     439        value = b1 + w * self.balance 
     440        if var.value != value: 
     441            var.value = value 
    430442 
    431443 
  • gaphas/branches/hw/gaphas/decorators.py

    r1304 r1623  
    138138    return wrapper 
    139139 
     140class recursive(object): 
     141    """ 
     142    This decorator limits the recursion for a specific function 
     143 
     144    >>> class A(object): 
     145    ...    def __init__(self): self.r = 0 
     146    ...    @recursive(10) 
     147    ...    def a(self, x=0): 
     148    ...        self.r += 1 
     149    ...        self.a() 
     150    >>> a = A() 
     151    >>> a.a() 
     152    >>> a.r 
     153    10 
     154    """ 
     155 
     156    def __init__(self, limit=10000): 
     157        self.limit = limit 
     158 
     159    def __call__(self, func): 
     160        def wrapper(*args, **kwargs): 
     161            try: 
     162                func._recursion_level += 1 
     163            except AttributeError: 
     164                # _recursion_level not present 
     165                func._recursion_level = 0 
     166            if func._recursion_level < self.limit: 
     167                try: 
     168                    return func(*args, **kwargs) 
     169                finally: 
     170                    func._recursion_level -= 1 
     171        return wrapper 
     172 
    140173 
    141174if __name__ == '__main__':