我正在寻找创建一个简单的python装饰器,但是我不确定我是否以最有效的方式实现它。我正在装饰的功能返回汽车注册,但是我希望能够始终返回测试注册。
我正在装饰签名的类方法是:
def get_car_registration(self, car_details)
这是我当前对装饰器的尝试。有没有更有效的方法来做到这一点。
from functools import wraps
def mock_registration(func):
@wraps(func)
def wrapper(*args, **kwargs):
pargs = list(args)
class_obj = pargs[0]
car_details = pargs[1]
if class_obj.test and car_details.car_name.startswith('test_demo'):
return 0
return func(*args, **kwargs)
return wrapper
z
答案 0 :(得分:3)
如果预先知道签名,则应该使用它。 Explicit is better than implicit:
def mock_registration(func):
@wraps(func)
def wrapper(obj, car_details):
if obj.test and car_details.car_name.startswith('test_demo'):
return 0
return func(obj, car_details)
return wrapper
如果相同签名的函数返回不同的内容,则您可能决定使一个可参数化的修饰符传递不同的默认返回值:
def mock_registration(default=0):
def decorator(func):
@wraps(func)
def wrapper(obj, car_details):
if obj.test and car_details.car_name.startswith('test_demo'):
return default
return func(obj, car_details)
return wrapper
return decorator
并装饰方法:
@mock_registration()
def get_car_registration(self, car_details):
# ....