我试图编写一个简单的decorator,在调用decorated函数之前记录一个给定的语句。记录的语句应该都来自同一个函数,我认为这是functools.wrapps()的目的。
为什么会出现以下代码:
import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(funcName)20s - %(message)s')
from functools import wraps
def log_and_call(statement):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
logging.info(statement)
return func(*args, **kwargs)
return wrapper
return decorator
@log_and_call("This should be logged by 'decorated_function'")
def decorated_function():
logging.info('I ran')
decorated_function()
生成如下日志语句:
wrapper - This should be logged by 'decorated_function'
decorated_function - I ran
我以为对wrapps的调用会用修饰的函数名重命名wrapper。
我使用的是Python2.7.1。
不幸的是,} 关键字参数为记录指定一些附加属性来解决此问题,然后可以在格式化期间使用这些属性。你可以这样做:
logging
使用函数代码对象来推断名称。可以通过使用^{这种方法的唯一缺点是每次都必须传入
extra
字典。要避免使用自定义格式化程序并使其重写funcName
:你想要什么:
我在docs中找到了实现方法,只需将此代码添加到您的decorator:
或者使用此装饰器代替functools.wrap:
我怀疑日志模块在函数对象上使用了“name”属性。即使将函数赋给另一个名称,这种情况通常也不会改变……您会看到相同的结果,例如:
当您调用bar时,您将得到
foo - in foo
,而不是bar - in foo
。装潢师也在做类似的事情。
相关问题 更多 >
编程相关推荐