zoukankan      html  css  js  c++  java
  • @log的decorator完美实现(原创)

     1 # -*- coding: utf-8 -*-
     2 
     3 from functools import wraps
     4 from inspect import isfunction
     5 
     6 def beforecalled(*args, **kwargs):
     7     print('before called! {}'.format(len(args)))
     8 
     9     for arg in args:
    10         print(arg)        
    11 
    12 def aftercalled(*args, **kwargs):
    13     print('after called! {}'.format(len(args)))
    14     for k,v in kwargs.iteritems():
    15         print('{0}={1}'.format(k,v))
    16 
    17     jclist=['-' for _ in xrange(20)]
    18     print(''.join(jclist))
    19 
    20 def logdeco(*decoargs, **decokwargs):
    21     def decotator(func):
    22         @wraps(func)
    23         def wrapper(*funcargs, **funckwargs):
    24             beforecalled(*decoargs, **decokwargs)
    25             result = func(*funcargs, **funckwargs)
    26             aftercalled(*decoargs, **decokwargs)
    27             return result
    28         return wrapper
    29     return decotator
    30 
    31 def log(*decoargs, **decokwargs):
    32     if len(decoargs)==1 and len(decokwargs)==0:
    33         if isfunction(decoargs[0]) or hasattr(decoargs[0],'__call__'):
    34             return logdeco()(decoargs[0])
    35 
    36     def wrappered(func):
    37         return logdeco(*decoargs, **decokwargs)(func)
    38 
    39     return wrappered
    40 
    41 @log('lisa',50,email='lisa@xxx.com')
    42 def testmoreparas(x,y):
    43     print('x*y={}'.format(x*y))
    44 
    45 @log()
    46 def testemptypara(x,y):
    47     print('x*y={}'.format(x*y))
    48 
    49 @log
    50 def testjustlog(x,y):
    51     print('x*y={}'.format(x*y))    
    52 
    53 if __name__=='__main__':
    54     testmoreparas(5,6)
    55     testemptypara(4,5)
    56     testjustlog(3,4)
    View Code
     1 Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:22:17) [MSC v.1500 32 bit (Intel)] on win32
     2 Type "copyright", "credits" or "license()" for more information.
     3 >>> 
     4 ============ RESTART: D:pytestlogdecorator.py ============
     5 before called! 2
     6 lisa
     7 50
     8 x*y=30
     9 after called! 2
    10 email=lisa@xxx.com
    11 --------------------
    12 before called! 0
    13 x*y=20
    14 after called! 0
    15 --------------------
    16 before called! 0
    17 x*y=12
    18 after called! 0
    19 --------------------
    20 >>> 
    test result
  • 相关阅读:
    字在线中
    关于页面显示层叠问题
    左边竖条
    jquery 动态添加元素事件绑定问题
    工作总结
    多文本输入,内容过多时输入框会自动撑开
    lunix常用命令
    springboot整合es availableProcessors is already set to [2], rejecting [2]
    mysql 主从复制架构
    elastic search 第一次安装 报错记录
  • 原文地址:https://www.cnblogs.com/zftylj/p/pythonlog.html
Copyright © 2011-2022 走看看