最初的函數(shù)
實(shí)現(xiàn)一個(gè)打印函數(shù),兩個(gè)功能:
- 打庸煤伞:i am foo
- 日志輸出: foo is running
import logging
logging.basicConfig(level=logging.INFO)
def hello():
print 'Hello world!'
logging.info("hello is running")
hello()
控制臺(tái)輸出效果:
Hello world!
INFO:root:hello is running
兩個(gè)函數(shù)有重復(fù)內(nèi)容
兩個(gè)函數(shù)都要輸出日志:函數(shù)名 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()
控制臺(tái)輸出效果:
Hello world!
INFO:root:hello is running
INFO:root:welcome is running
Welcome!
重構(gòu)兩個(gè)函數(shù):提煉重復(fù)部分
把重復(fù)的部分logging.info("函數(shù)名 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)
顯示效果如下妇斤,與上面一節(jié)相同:
Hello world!
INFO:root:hello is running
Welcome!
INFO:root:welcome is running
再次重構(gòu):保持原函數(shù)名
仍然保留了原來的函數(shù)名:
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!
為了保證參數(shù)正確惹资,使用不定參數(shù)
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()
語法糖:@函數(shù)名
@函數(shù)名是語法糖扼脐,直接表示包裹在該函數(shù)的外層函數(shù)纹腌。最終還是調(diào)用里層函數(shù)幌缝,就可以同時(shí)實(shí)現(xiàn)包裹的外層函數(shù)的作用灸促。
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