pytho装饰器参数那些事_inspect.getcallargs

'''
Created on Jul 26, 2019

@author: tomcat
'''

import inspect
def chack_admin(func):
    def wrapper(*args,**kwargs):
        '''
        inspect.getcallargs 返回一个字典,字典里保存了函数所有的参数
        inspect.getcallargs(func[, *args][, **kwds]):将args和kwds参数到绑定到为func的参数名;对bound方法,也绑定第一个参数(通常为self)到相应的实例;返回字典,对应参数名及其值;
        '''
        fuc_args=inspect.getcallargs(func,*args,**kwargs)
        print("arg{},keord{},fuc_args{}".format(args, kwargs,fuc_args))
        if fuc_args.get("username") =="admin":
            re=func(*args,**kwargs)
        else:
            raise Exception('没有资格添加或删除元素')
        return re
    return wrapper
class MyClass(object):
    def __init__(self):
        self.item=[90.89]
    '''
     如果username!=admin,没有资格添加一个元素
    '''
    @chack_admin
    def push(self,username,item):
        self.item.append(item)
    '''
    如果username!=admin,没有资格删除一个元素
    '''
    @chack_admin   
    def pop(self,username):
        if self.item:
            return self.item.pop()
        else:
            raise Exception('item 中没有元素')
if __name__ == '__main__':
    m=MyClass()
    m.push('admin',10)
    m.push(username="admin",item=902)
    m.pop(username='admin')
    print(m.item)

arg(<__main__.MyClass object at 0x10c5b5240>, 'admin', 10),keord{},fuc_args{'self': <__main__.MyClass object at 0x10c5b5240>, 'username': 'admin', 'item': 10}

arg(<__main__.MyClass object at 0x10c5b5240>,),keord{'username': 'admin', 'item': 902},fuc_args{'self': <__main__.MyClass object at 0x10c5b5240>, 'username': 'admin', 'item': 902}

arg(<__main__.MyClass object at 0x10c5b5240>,),keord{'username': 'admin'},fuc_args{'self': <__main__.MyClass object at 0x10c5b5240>, 'username': 'admin'}

[90.89, 10]

原文地址:https://www.cnblogs.com/tallme/p/11247899.html