下面是我的@logged()
装饰器制造商。它的工作原理大致如下:
它接受一个logger
实例和一个disabled
标志。
如果disabled
是False
,则在装饰函数之前/之后输出一些日志。
如果disabled
是True
,则它不输出任何内容并抑制logger
装饰函数的 。
无论是logger
和disabled
参数有自己的缺省值。但是,当我想使用默认值时,我仍然需要写空括号,如下所示:
@logged()
def foo():
pass
当我只想要默认参数时,有没有办法摆脱这些空括号?这是我想要的一个例子:
@logged
def foo():
pass
@logged(disabled=True)
def bar():
pass
@logged()装饰器制造商的代码:
import logging
import logging.config
from functools import wraps
def logged(logger=logging.getLogger('default'), disabled=False):
'''
Create a configured decorator that controls logging output of a function
:param logger: the logger to send output to
:param disabled: True if the logger should be disabled, False otherwise
'''
def logged_decorator(foo):
'''
Decorate a function and surround its call with enter/leave logs
Produce logging output of the form:
> enter foo
...
> leave foo (returned value)
'''
@wraps(foo)
def wrapper(*args, **kwargs):
was_disabled = logger.disabled
# If the logger was not already disabled by something else, see if
# it should be disabled by us. Important effect: if foo uses the
# same logger, then any inner logging will be disabled as well.
if not was_disabled:
logger.disabled = disabled
logger.debug(f'enter {foo.__qualname__}')
result = foo(*args, **kwargs)
logger.debug(f'leave {foo.__qualname__} ({result})')
# Restore previous logger state:
logger.disabled = was_disabled
return result
return wrapper
return logged_decorator
logging.config.dictConfig({
'version': 1,
'formatters': {
'verbose': {
'format': '%(asctime)22s %(levelname)7s %(module)10s %(process)6d %(thread)15d %(message)s'
}
, 'simple': {
'format': '%(levelname)s %(message)s'
}
}
梦里花落0921
POPMUISE
相关分类