如果满足条件,则Python Decorator返回值,否则返回函数

时间:2020-04-01 15:42:33

标签: python decorator

我正在寻找创建一个简单的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

1 个答案:

答案 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):
    # ....