#装饰器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)
这个例子有问题,如果看到的朋友,帮我指出来,在这先谢谢了
python高级编程之装饰器02