""" File checkparams.py Written by ll.snark Type Checking in Python using decorators Use the decorator checkparams to check (only unnamed) parameters type Use the decorator checkreturn to check a return value type : @checkreturn(int) @checkparams(int,int) def ajoute(a,b) : if a<0 : return "No negative numbers" return a+b Then Try : ajoute(5,6) ajoute(5,"Argh") ajoute(-4,6) """ def checkparams(*params) : def decorator(fonc) : def foncm(*pnn,**pn) : for i,par in enumerate(zip(pnn,params)) : if type(par[0])!=par[1] : raise TypeError(foncm.__name__+" Param "+str(i)+" ("+str(par[0])+") is not "+str(par[1])) r=fonc(*pnn,**pn) return r foncm.__name__=fonc.__name__ foncm.__doc__=fonc.__doc__ return foncm return decorator def checkreturn(tor) : def decorator(fonc) : def foncm(*pnn,**pn) : r=fonc(*pnn,**pn) if type(r)!=tor : print(type(r)) raise TypeError(foncm.__name__+" : Return value ("+str(r)+") is not "+str(tor)) return r if hasattr(fonc,'__oldname__') : foncm.__oldname__=fonc.__oldname__ foncm.__name__=fonc.__name__ foncm.__doc__=fonc.__doc__ return foncm return decorator if __name__=='__main__' : @checkreturn(int) @checkparams(int,int) def ajoute(a,b) : """ Just a sample function to test decorators. """ if a<0 : return "No negative numbers" return a+b print(ajoute(5,6)) print(ajoute(0,"foo")) print(ajoute(-3,4))