1.python装饰器的缺点
装饰器可以允许我们在不改变函数或犯方法的调用方式的情况下,添加额外的功能;
如下所示,我们要在中的方法之前增加装饰器check_is_admin,用来判断执行类的方法的用户是否为admin用户;
def check_is_admin(f): def wrapper(*args,**kwargs): if kwargs.get(‘username‘) != ‘admin‘: raise Exception("This user is not allowed to get food") return f(*args,**kwargs) return wrapper class store(object): @check_is_admin def get_food(self,username,food): return self.storage.get(food) @check_is_admin def put_food(self,username,food): self.storage.put(food)
但是,经过装饰器修饰的函数,其func_name和func_doc的属性都会丢失;
如下:
def foobar(username="someone"): """Do crzay staff.""" pass print foobar.func_doc print foobar.func_name 执行结果为: Do crzay staff. foobar
如果给上述函数增加装饰器呢?
def is_admin(f): def wrapper(*args,**kwargs): if kwargs.get(*args,**kwargs): raise Exception("This user is not allowed to get food") return f(*args,**kwargs) return wrapper @is_admin def foobar(username="someone"): """Do crazy staff""" pass print foobar.__doc__ print foobar.__name__ 执行结果为: None wrapper
2.解决方案
使用functools的update_wrapper函数可以解决该问题
如下:
def is_admin(f): def wrapper(*args,**kwargs): if kwargs.get(*args,**kwargs): raise Exception("This user is not allowed to get food") return f(*args,**kwargs) return wrapper def foobar(username="someone"): """Do crazy staff""" pass import functools foobar = functools.update_wrapper(is_admin,foobar) print foobar.__name__ print foobar.__doc__ 执行结果如下: foobar Do crazy staff
时间: 2024-10-18 05:23:36