[英]How can I programmatically change the argspec of a function *not* in a python decorator?
[英]how i can change my function into decorator python?
在此代码中,我检查 email 和密码验证
如果 email 以 {@gmail.com} 结尾并且密码长度为 8 i print (hello user)
def login(email, password):
valid_mail = "@gmail.com"
print()
if email[-10:] == valid_mail and len(str(password)) == 8:
print(f'hello {email} welcome back')
else:
print("invalid user")
现在我想将我的登录 function 更改为
def login(email, password):
print(f' welcome {email }')
并使用装饰器 function 检查条件是否为真,然后打印登录 function,
def my_decorator(func):
def wrapper_function(*args, **kwargs):
if email[-10:] == "@gmail.com" and len(str(password)) == 8:
return wrapper_function
else:
print("not user")
return func(*args, **kwargs)
return wrapper_function
我知道这是错误的解决方案,我刚刚学习 python 有点困惑)请帮助我
>>>
>>>
>>> email = ' example@gmail.com '
>>> email.endswith('@gmail.com')
False
>>>
>>> email.strip()
'example@gmail.com'
>>>
>>> email.strip().endswith('@gmail.com')
True
>>>
def login(email):
user = email.split('@')[0]
print('hello ',user)
def my_decorator(email,password):
email = email.strip()
if email.endswith('@gmail.com') and len(password) == 8:
login(email)
else:
print("invalid user")
my_decorator('example_@gmail.com','@1234567')
my_decorator('example@gmail.com','123456789')
装饰器可以实现为 function ,内部 function 充当包装器。 装饰器接收一个 function,包装它,调用输入 function,然后返回包装器:
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper_function(*args, **kwargs):
email = kwargs.get("email", "")
password = kwargs.get("password", "")
if email[-10:] == "@gmail.com" and len(str(password)) == 8:
func(**kwargs)
else:
print("not user")
return wrapper_function
@my_decorator
def login(email, password):
print(f' welcome {email}')
login(email="johnsmith@gmail.com", password="01234567")
您可能还想看看functools.wraps ,它本身就是一个装饰器,以及它如何避免用包装器之一替换装饰的 function 的名称和文档字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.