我有一個負責記錄日志的裝飾器。例如這樣的事情:
import logging
import functools
from typing import Callable
def log_container(func: Callable, logger=None):
if logger is None:
logger = logging.getLogger("default")
@functools.wraps(func)
def wrapper(*args, **kwargs):
logger.info(f"{func.__qualname__} started.")
result = func(*args, **kwargs)
logger.info(f"{func.__qualname__} ended.")
return result
return wrapper
我有一個具有不同記錄器作為屬性的類,我想將該記錄器作為裝飾器引數。這可能嗎?如果是這樣,如何?
class Dummy:
logger = logging.getLogger("Dummy")
@log_container(logger=Dummy.logger)
def do_something(self):
pass
uj5u.com熱心網友回復:
您的裝飾器,正如其當前定義的那樣,不起作用。您不能將裝飾函式與引數一起傳入,因為裝飾器本身只接受一個引數:它func本身。如果你想讓你的裝飾器接受一個引數,你需要將裝飾器嵌套更深一層。現在變成了一個回傳裝飾器的函式:
def log_container(logger=None):
if logger is None:
logger = logging.getLogger("default")
def inner(func: Callable):
@functools.wraps(func)
def wrapper(*args, **kwargs):
logger.info(f"{func.__qualname__} started.")
result = func(*args, **kwargs)
logger.info(f"{func.__qualname__} ended.")
return result
return wrapper
return inner
然后在為Dummy類裝飾方法時,不要使用,Dummy.logger因為Dummy直到類定義結束才會定義,而是可以logger直接訪問類屬性。
class Dummy:
logger = logging.getLogger("Dummy")
@log_container(logger=logger)
def do_something(self):
pass
# Use default logger
@log_container()
def do_something_else(self):
pass
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/342476.html
標籤:Python 日志记录 python-装饰器 蟒蛇类
