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