Welcome, guest | Sign In | My Account | Store | Cart
""" 
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))

History