简体   繁体   中英

How to use multiple decorator to a function and chain them together?

How can I make two decorators in Python that would do the following?

@check_zero_error
@check_numerator
def division(a, b):
    return a/b

'check_numerator' will reverse the numbers in case numerator is lesser than denominator.

'check_zero_error' will give check for the zero division error.

The expected output is:

division(1, 2)   # Output : 2.0

division(0, 2)   # Output : "Denominator can't be zero"
 
division(4, 1)   # Output : 4.0

division(5, 0)   # Output : "Denominator can't be zero"

My code is as below but I am not getting expected results:

def check_zero_error(division_func):
    def inner(a, b):
        if b == 0:
            return "Denominator can't be zero"
        else:
            division_func(a, b)
    return inner

def check_numerator(division_func):
    def inner(a, b):
        if a < b:
            a, b = b, a
        division_func(a, b)
    return inner


@check_zero_error
@check_numerator
def division(a, b):
    return a/b
       

print(division(1, 2))  # Expected output : 2.0
print(division(0, 2))  # Expected output : "Denominator can't be zero"
print(division(4, 1))  # Expected output : 4.0
  1. Your decorators method should return the result of the division

    def check_zero_error(division_func): def inner(a, b): if b == 0: return "Denominator can't be zero" else: return division_func(a, b) return inner def check_numerator(division_func): def inner(a, b): if a < b: a, b = b, a return division_func(a, b) return inner
  2. Change the order of decorators, first swap ( check_numerator ) then if needed, THEN check the denominator with check_zero_error

    @check_numerator @check_zero_error def division(a, b): return a / b

Giving expected

print(division(1, 2))  # actual output : 2.0
print(division(0, 2))  # actual output : "Denominator can't be zero"
print(division(4, 1))  # actual output : 4.0
print(division(5, 0))  # actual output :  "Denominator can't be zero"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM