Created
June 28, 2016 13:16
-
-
Save limboinf/d3214641ffc44c1b64668a3625ee142d to your computer and use it in GitHub Desktop.
装饰器会用一个动态创建的新函数替换原来的。然而新函数缺少很多原函数的属性,如__doc__, __name__等,需要 from functools import wraps 复制这些属性给装饰器。 inspect模块运行提取函数的签名,如参数。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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