zoukankan      html  css  js  c++  java
  • python学习记录

    学习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加载顺序是由外至内,不知道正确与否

  • 相关阅读:
    WebGL学习笔记(一)
    svn和ftp的不同应用场合
    Java 开源博客 Solo 1.8.0 发布
    【C解毒】滥用变量
    【C解毒】答非所问
    【C解毒】错题无解
    【C解毒】怎样写main()函数
    程序员约架事件中,薛非到底是因为不会用Github还是不会写Tokenizer而没有应战?
    『一些同学学不好C语言,把罪责归于「因为教材是谭浩强写的」实在是很滑稽』吗?
    挂羊头卖狗肉蓄意欺骗读者——谭浩强《C程序设计(第四版)》中所谓的“按照C99”(二)
  • 原文地址:https://www.cnblogs.com/hh2737/p/9482941.html
Copyright © 2011-2022 走看看