最初的函数
实现一个打印函数,两个功能:
- 打印:i am foo
- 日志输出: foo is running
import logging
logging.basicConfig(level=logging.INFO)
def hello():
print 'Hello world!'
logging.info("hello is running")
hello()
控制台输出效果:
Hello world!
INFO:root:hello is running
两个函数有重复内容
两个函数都要输出日志:函数名 is running。
import logging
logging.basicConfig(level=logging.INFO)
def hello():
print 'Hello world!'
logging.info("hello is running")
def welcome():
print 'Welcome!'
logging.info("welcome is running")
hello()
welcome()
控制台输出效果:
Hello world!
INFO:root:hello is running
INFO:root:welcome is running
Welcome!
重构两个函数:提炼重复部分
把重复的部分logging.info("函数名 is running")提出来。
import logging
logging.basicConfig(level=logging.INFO)
def log_func(func):
logging.info("%s is running" % func.__name__)
func()
def hello():
print 'Hello world!'
def welcome():
print 'Welcome!'
log_func(hello)
log_func(welcome)
显示效果如下,与上面一节相同:
Hello world!
INFO:root:hello is running
Welcome!
INFO:root:welcome is running
再次重构:保持原函数名
仍然保留了原来的函数名:
import logging
logging.basicConfig(level=logging.INFO)
def log_func(func):
def wrapper():
logging.info("%s is running" % func.__name__)
return func()
return wrapper
def hello():
print "Hello world!"
def welcome():
print "Welcome!"
hello = log_func(hello)
hello()
welcome = log_func(welcome)
welcome()
输出效果:
INFO:root:hello is running
Hello world!
INFO:root:welcome is running
Welcome!
为了保证参数正确,使用不定参数
import logging
logging.basicConfig(level=logging.INFO)
def log_func(func):
def wrapper(*args, **kwargs):
logging.info("%s is running" % func.__name__)
return func(*args, **kwargs)
return wrapper
def hello():
print "Hello world!"
def welcome():
print "Welcome!"
hello = log_func(hello)
hello()
welcome = log_func(welcome)
welcome()
语法糖:@函数名
@函数名是语法糖,直接表示包裹在该函数的外层函数。最终还是调用里层函数,就可以同时实现包裹的外层函数的作用。
import logging
logging.basicConfig(level=logging.INFO)
def log_func(func):
def wrapper(*args, **kwargs):
logging.info("%s is running" % func.__name__)
return func(*args, **kwargs)
return wrapper
@log_func
def hello():
print "Hello world!"
@log_func
def welcome():
print "Welcome!"
hello()
welcome()
最终显示:
Hello world!
INFO:root:hello is running
Welcome!
INFO:root:welcome is running