Skip to content

Instantly share code, notes, and snippets.

@limboinf
Created June 28, 2016 13:16
Show Gist options
  • Save limboinf/d3214641ffc44c1b64668a3625ee142d to your computer and use it in GitHub Desktop.
Save limboinf/d3214641ffc44c1b64668a3625ee142d to your computer and use it in GitHub Desktop.
装饰器会用一个动态创建的新函数替换原来的。然而新函数缺少很多原函数的属性,如__doc__, __name__等,需要 from functools import wraps 复制这些属性给装饰器。 inspect模块运行提取函数的签名,如参数。
# coding=utf-8
"""
装饰器会用一个动态创建的新函数替换原来的。
然而新函数缺少很多原函数的属性,如__doc__, __name__等,
需要 from functools import wraps 复制这些属性给装饰器。
inspect模块运行提取函数的签名,如参数。
:copyright: (c) 2016 by fangpeng(@beginman.cn).
:license: MIT, see LICENSE for more details.
"""
import functools
import inspect
def check_is_admin(f):
@functools.wraps(f)
def wraper(*args, **kwargs):
func_args = inspect.getcallargs(f, *args, **kwargs)
print func_args # {'type': 'look', 'user': 'admin'}
print args # ()
print kwargs # {'user': 'admin'}
# if kwargs.get('user') != 'admin':
if func_args.get('user') != 'admin':
raise ValueError
return f(*args, **kwargs)
return wraper
@check_is_admin
def get_data(user, type="look"):
"""docs"""
return 'data', user, type
if __name__ == '__main__':
print get_data(user='admin')
print get_data.__doc__
print get_data.__name__
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment