python学习记录

时间:2022-06-26 12:39:44

学习python中·······

今天写了个装饰器用来登录用,用户名和密码是存在文件里的,涉及到了装饰器和带参数的装饰器

文件里的内容如下

{"liming": 123456}
{"zhangsan": 1234545}

类似于字典格式

装饰器代码如下

def login(t="false"):
def if_login(func):
if t == "false":
username = str(input("Please input your name: "))
password = input("Please input your password: ")
userdic = {}
with open("test.txt", 'r') as f:
for i in f.readlines():
x = eval(i)
userdic.update(x)
if username in userdic:
if password == str(userdic[username]):
print("Welcom....")
return func
else:
print("password or username error")
else:
print("password or username error1")
else:
return func
return if_login

红色代码部分思路是这样的,先定义一个空字典,然后打开文本文件,然后遍历这个文本文件,并把每次遍历出来的字符串转化为字典,并且更新到原来的空字典中,这样我们就有一个所有用户名和密码的字典了

这样的缺点是,如果是用户名和密码多的话,会浪费内存,毕竟都要加载到字典中,剩下就是判断了,就没那么麻烦了。

另外需要注意的是 3个 return,第一个return 是如果标识符是false的话需要用户登录,登陆成功后返回func也就是传入的函数,第二个return如果传入的标识符参数不是false的话直接返回func,这样用户就不用登录了,

最后一个return 是login函数的返回值,这里如果不写的话,调用后会报错,报错如下

@login("true")
def web():
print("this is a index page") 以下是报错信息
Traceback (most recent call last):
File "F:/xuexi/files.py", line 45, in <module>
@login("true")
TypeError: 'NoneType' object is not callable

因为login如果没返回值,那么就是NoneType,那么这个类型是不不可调用的,会报错,

最开始时候没写,导致出错了,还是学艺不精,需要多学习。

再来看下带参数装饰器的执行过程

@login("true")
def web():
print("this is a index page")

以上代码等价于下面的

x = login("true")
t = x(web)
t()

以上内容等价于

x 得到的返回值是if_login函数

t 得到的返回值是if_login(web)函数

最后t()得到返回值是login的返回值,感觉还是有点问题

login("true")(web)()

先传入true参数,得到if_login函数,给if_login函数传入web参数,得到if_login函数执行后的返回值,最后得到login函数的返回值

login函数得到的return结果是if_login函数整体执行结果。

if_login函数得到的return结果web函数。

if_login函数整体结果是判断内容加retrun的web函数

由此可以猜想,嵌套函数是由最内层到最外层一层层把结果返回直到最外层,但是代码执行时候,return加载顺序是由外至内,不知道正确与否