• python---上下文管理器


    需求:

    想要在某些操作执行前后去完成某些固定操作

    from queue import Queue
    q = Queue()
    
    li = []
    
    
    li.append(1)  #在执行前想要做的操作
    q.get()  
    #在队列中获取值,想要在其前面和后面完成这些固定操作。若是一个具有重复性的工作,而且该操作复杂,那么我们最好将其注册为上下文管理器,可以使得代码简明 li.remove(
    1)  #在执行后想要做的操作

    举例:

    在我们使用with对文件进行操作的时候就是上下文管理

    with open("te.py","r",encoding="utf-8") as fp:  #将yield返回值使用as赋予给fp变量
        data = fp.read()
        print(data)

    这个上下文管理器,主要是在文件操作之后为我们加上了close方法,关闭了文件描述符

    使用:引入contextlib包,使用装饰器方法contextmanager去修饰自定义方法,就可以使用with方法去调用

    注意:其中使用到了生成器:

    from queue import Queue
    import contextlib
    
    q = Queue()
    
    
    @contextlib.contextmanager
    def worker_state(li,num):
        li.append(num)
        print(li)
        try:
            yield
        finally:
            li.remove(num)
            print(li)
    
    q.put("dsa")
    li = []
    
    with worker_state(li,1):
        q.get()

     自定义myopen方法打开文件:

    import contextlib
    
    
    @contextlib.contextmanager
    def myopen(file_path,mode):
        fp = open(file_path,mode,encoding="utf-8")  #先打开文件,获取文件描述符
        try:
            yield fp  #返回文件描述符
        finally:
            fp.close()  #执行完毕,关闭文件描述符
    
    with myopen("test.py",mode="r") as fp:  #调用自定义管理器,从yield获取文件描述符
        print(fp)
        data = fp.read()
        print(data)
  • 相关阅读:
    EMQ ---payload
    EMQ --集成搭建
    chome 离线安装包地址
    EMQ ---问题集
    EMQ学习---客户链接资源消耗
    EMQ学习 ---集群
    EMQ 学习---MQTT消息QoS
    EMQ 学习---订阅$SYS主题,捕获客户端上下线消息
    EMQ学习笔记---Clean Session和Retained Message
    elasticsearch学习网站
  • 原文地址:https://www.cnblogs.com/ssyfj/p/9029667.html
Copyright © 2020-2023  润新知