多层语法糖嵌套

发布时间 2023-12-13 21:47:41作者: 桃源氏

多层语法糖嵌套

user_pwd = {"Xanadu": "521"}
bank_pwd = {"pay_password": "521", "balance": 1000}

name_input = input("请输入姓名:")
pwd_input = input("请输入密码:")
amount_input = input("请输入取款金额:")


def check(tag):
    if tag == "login_check":
        def check_user(func):

            def inner(*args, **kwargs):
                if name_input not in user_pwd:
                    return f"{kwargs['name']}用户名未注册!"
                if user_pwd[name_input] != pwd_input:
                    return f"{kwargs['name']}密码错误!"
                else:
                    return func(**kwargs)

            return inner

        return check_user
    if tag == "bank_check":
        def check_bank(func):
            pay_pwd = input("请输入支付密码:")

            def inner(*args, **kwargs):
                if pay_pwd != bank_pwd['pay_password']:
                    return "支付密码错误!"
                if not kwargs["amount"].isdigit():
                    return "请输入数字!"
                amount = int(kwargs["amount"])
                if amount > bank_pwd["balance"]:
                    return "余额不足!"
                else:
                    res = func(*args, **kwargs)
                    return res

            return inner

        return check_bank


@check("login_check")
@check("bank_check")
def get_balance(name, amount):
    return f"{name}成功去到{amount}元!"


print(get_balance(name=name_input, amount=amount_input))

'''
请输入姓名:Xanadu
请输入密码:521
请输入取款金额:500
请输入支付密码:521
Xanadu成功去到500元!
'''


#上述语法糖的嵌套相当于将check()函数拆分之后按照从上到下执行两个装饰器
@check("login_check")   get_balance = check_user(get_balance)
@check("bank_check")   get_balance = check_bank(get_balance)

#嵌套的时候继承关系式从下到上,执行顺序是从上到下
  • 语法糖嵌套运行思路
# *多层语法糖如何使用
def desc_a(func):
    print(f'111')  # 一

    # wraps(func)

    def inner(*args, **kwargs):
        print(f'222')  # 四
        res = func(*args, **kwargs)  # 真正的add函数
        print(f'333')  # 五
        return res

    return inner


def desc_b(func):
    print(f'444')  # 二

    def inner(*args, **kwargs):
        print(f'555')  # 三
        res = func(*args, **kwargs)  # desc_a 的inner
        print(f'666')  # 六
        return res

    return inner


# @desc_b
# @desc_a
def add():
    print(f'777')  # 七


# 继承顺序是从下向上集成
# 执行顺序是从上向下执行
# 先验证用户名再验证密码

# add()
add = desc_a(add)
add = desc_b(add)
add()  # 111 -- 444 -- 555 -- 222 -- 777 -- 333 -- 666