python中可变参数与装饰器的例子,装饰器用途结合项目代


python的可变参数

方法定义

#*args是可以传list类型的可变参数,**kwargs是可以传dict的可变参数
def wrapper(*args, **kwargs):

使用示例

def foo(*args, **kwargs):
    print 'args = ', args
    print 'kwargs = ', kwargs
    print '---------------------------------------'

if __name__ == '__main__':
    foo(1,2,3,4)
    foo(a=1,b=2,c=3)
    foo(1,2,3,4, a=1,b=2,c=3)
    foo('a', 1, None, a=1, b='2', c=3)

输出结果:

输出结果如下:
args =  (1, 2, 3, 4)
kwargs =  {}
---------------------------------------
args =  ()
kwargs =  {'a': 1, 'c': 3, 'b': 2}
---------------------------------------
args =  (1, 2, 3, 4)
kwargs =  {'a': 1, 'c': 3, 'b': 2}
---------------------------------------
args =  ('a', 1, None)
kwargs =  {'a': 1, 'c': 3, 'b': '2'}

例子来源《Python tips: 什么是*args和**kwargs? - MK2 - 博客园 (cnblogs.com)》


装饰器例子

搭配装饰器使用,用来判断是否为空

#定义一个函数,并进行wrapper一层,用来当作装饰器
def leftTopUICheck(func):
	def wrapper(*args, **kwargs):
		if hasattr(xxglobal.rds, 'MainPartLeftTopUI'):
			return func(*args, **kwargs)
		else:
			return
	return wrapper

@leftTopUICheck
def setLeftTopPictureFrameRes(filename):
	xxglobal.rds.MainPartLeftTopUI.setPictureFrameRes(filename)

定义

@符号是一个语法糖,当执行函数时,会把当前函数传入到@指向的函数中执行。


装饰器用途

结合项目代码来看,目前我们大多是用在前置检查,且会把装饰器函数定义在sys.path内的文件中,避免每次使用都要import。如果装饰器的函数实现在同一个文件中则不需要import。


装饰器与C#

在C#中有Attribute,写法上和装饰器一样都是在方法名的上行加上,它也可以达到装饰器的一些功能。

//MenuItem 定义:
public MenuItem(string itemName, bool isValidateFunction)
    
//用法
[MenuItem("Assets/开启XXX", false)]
public static void openXXFunc()
{

}

但是如果要实现装饰器完整的前置检查,在C#中我一般是传入一个(Action callback)来处理。

void Check(Action callback){
    if (not 前置检查) return;
    callback.Invoke();
}

评论关闭