多层语法糖嵌套
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