一篇强调装饰器重要性的文章举了装饰器用法的例子。
from myapp.log import logger
def log_order_event(func):
def wrapper(*args, **kwargs):
logger.info("Ordering: %s", func.__name__)
order = func(*args, **kwargs)
logger.debug("Order result: %s", order.result)
return order
return wrapper
@log_order_event
def order_pizza(*toppings):
# let's get some pizza!
order_pizza(*toppings) # 用法
这不是等于下面没有修饰符的代码吗?
from myapp.log import logger
def log_order_event(func, *args, **kwargs):
logger.info("Ordering: %s", func.__name__)
order = func(*args, **kwargs)
logger.debug("Order result: %s", order.result)
return order
def order_pizza(*toppings):
# let's get some pizza!
log_order_event(order_pizza, *toppings) # 使用方法
实际上,第二个代码片段是否更加容易编写,因为它只有一个函数而不是一个函数和一个包装函数?虽然使用方法调用比较长,但更清楚地指示了实际被调用的内容。
这仅仅是一种口味和语法糖问题,还是我遗漏了什么?
order_pizza = log_order_event(order_pizza)
,因此绝对不是一种黑客技巧。) - Ry-@syntax
只是为了让order_pizza = log_order_event(order_pizza)
更加简洁明了。 - juanpa.arrivillaga