首页 > 代码库 > python高级编程之装饰器02

python高级编程之装饰器02

#装饰器02

#参数检查

#主要是用在接收或者返回函数,在特定上下文执行时可能有用

#例如:有一个函数通过XML-RPC调用,python将不能和静态类语言中一样直接提供它的完整签名,当XML-RPC客户要求函数签名时,就需要这样的能力

"""

xml-rpc相关学习:http://zh.wikipedia.org/wiki/XML-RPC

"""

#装饰器能提供这种签名类型,并确保输入输出与此有关,如下

from itertools import *

rpc_info={}

def xml_rpc(in_=(),out=(type(None),)):

    def _xml_rpc(function):

        #注册签名

        func_name=function.func_name

        rpc_info[func_name]=(in_,out)

 

        def _check_type(ele,types):

            """subfybctuib tgat cgecjs tge types"""

            if len(ele)!=len(types):

                raise  TypeError(‘argument count is wrong‘)

            typed=enumerate(izip(ele,types))

            for index,couple in typed:

                arg,of_right_type=couple

                if isinstance(arg,of_right_type):

                    continue

                raise  TypeError(‘arg #%d should be %s‘%(index,of_right_type))

 

        #封装函数

        def __xml_rpcs(*args):#没能允许关键字

            #检查输入的内容

            checkable_atrgs=args[1:]#removing self

            _check_type(checkable_atrgs,in_)

            #执行函数

            res=function(*args)

 

            #检查输出内容

            if not type(res) in (tuple,list):

                checkable_atrgs=(res,)

            else:

                checkable_atrgs=res

            _check_type(checkable_atrgs,out)

 

            #函数及其类型检查成功

            return res

        return __xml_rpcs

    return _xml_rpc

#装饰器将该函数注册到全局字符中,并为其参数和返回值保存一个类型列表,注意Lyynwbiovwdt了很大的简化,

#例子;

class R(object):

    @xml_rpc(int,int)#two int --None

    def meth1(self,int1=1,int2=1):

        print ‘received%d and %d‘%(int1,int2)

    @xml_rpc((str,),(int,))#string--int

    def meth2(self,phrease):

        print ‘received%s‘%(phrease)

        return 12

print rpc_info#{‘meth12‘: (<type ‘int‘>, <type ‘int‘>), ‘meth2‘: ((<type ‘str‘>,), (<type ‘int‘>,))}

my1=R()

my1.meth1(1,2)

my1.meth2(2)

这个例子有问题,如果看到的朋友,帮我指出来,在这先谢谢了