CodyKochmann
10/14/2016 - 3:12 PM

predicate filtering for python inputs

predicate filtering for python inputs

class predicate(object):
    """flow control for functions of the same name"""
    """by: cody kochmann"""
    def __init__(self, *requirements):
        assert all(type(i) is type(lambda:0) for i in requirements), "predicate arguments need to be lambdas"
        self.requirements = requirements # use lists to preserve order

    def __call__(self,f):
        def predicate_wrapper(*args):
            assert len(args) >= len(self.requirements), '"def {}()" has more requirements than args'.format(f.__name__)
            #print "decorator argument for {}() ".format(f.__name__),self.requirements
            #print "function argument: ", args
            # test that all requirements are true
            can_continue = all(r(a) for r,a in zip(self.requirements,args))
            return (f(*args) if can_continue else None)
        return predicate_wrapper

@predicate(lambda i: isinstance(i,int), lambda ii: isinstance(ii,float))
def print_int_float(i,ii):
    #assert isinstance(i, int), "i is needs to be an int."
    #assert isinstance(ii,float), "ii needs to be a float"
    print i, ii

print_int_float(1,1)
print_int_float(1,1.0)
print_int_float(5,5)
print_int_float(5,5.5)

# 1 1.0
# 5 5.5