python装饰器代码_python装饰器关键代码

本文展示了Python中如何使用装饰器进行日志记录和调试。通过`debug_named`装饰器实现特定模块的日志调试,以及`audit`装饰器用于类方法的审计日志。示例中包括递归函数`ackermann`的调试和`Person`类的加法操作审计。
摘要由CSDN通过智能技术生成

带参数的装饰器

__author__ = 'similarface'

import sys

import logging

import functools

logging.basicConfig( stream=sys.stderr, level=logging.DEBUG )

def decorator(config):

def concrete_decorator(function):

def wrapped( *args, **kw ):

return function( *args, ** kw )

return wrapped

return concrete_decorator

def debug_named(log_name):

def concrete_decorator(function):

@functools.wraps( function )

def wrapped( *args, **kw ):

log= logging.getLogger( log_name )

log.debug( "%s( %r, %r )", function.__name__, args, kw, )

result= function( *args, **kw )

log.debug( "%s = %r", function.__name__, result )

return result

return wrapped

return concrete_decorator

@debug_named( "recursion" )

def ackermann( m, n ):

if m == 0: return n+1

elif m > 0 and n == 0: return ackermann( m-1, 1 )

elif m > 0 and n > 0: return ackermann( m-1, ackermann( m, n-1 ) )

print( ackermann(2,4) )

类方法装饰器

import sys

import logging

import functools

def audit( method ):

@functools.wraps(method)

def wrapper( self, *args, **kw ):

audit_log= logging.getLogger( 'audit' )

before= repr(self)

try:

result= method( self, *args, **kw )

after= repr(self)

except Exception as e:

audit_log.exception( '%s before %s\n after %s', method.__qualname__, before, after )

raise

audit_log.info( '%s before %s\nafter %s', method.__qualname__, before, after )

return result

return wrapper

class Person:

def __init__( self,*address ):

self.address=list(address)

@audit

def __iadd__( self, addr ):

self.address.append(addr)

return self

def __repr__( self ):

address= ", ".join( map(str,self.address) )

return "{__class__.__name__}({addr})".format(__class__=self.__class__, addr=address)

logging.basicConfig( stream=sys.stderr, level=logging.DEBUG )

p= Person("北京","上海","天津")

p.__iadd__('广东')

类装饰器

__author__ = 'similarface'

import sys

import logging

logging.basicConfig( stream=sys.stderr, level=logging.DEBUG )

def logged(class_):

class_.logger=logging.getLogger(class_.__qualname__)

return class_

@logged

class Person:

def __init__(self,name):

self.name=name

self.logger.info("Good")

def method(self,*args):

self.logger.info("method %r",args)

@logged

class Student(Person):

def __init__(self,g):

self.name=g

self.logger.info("Good")

def study(self,*args):

self.logger.info("method %r",args)

p=Person("similarface")

p.method("Nice day")

s=Student("similarface")

s.method("Nice a day")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值