zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    C# 集合类 :(Array、 Arraylist、List、Hashtable、Dictionary、Stack、Queue)
    "Isa"与"Hasa"
    Access、SQLite、HSQLDB、Sybase、MySQL、DB4O比较
    C#反射(二)
    跳出语句
    C#反射(一)
    返回集合使用IEnumerable<>还是IList<>
    理解C#值类型与引用类型
    WF4 Beta2 工作原理
    Interesting thing with WF4 Activity Scheduling
  • 原文地址:https://www.cnblogs.com/ssyfj/p/9029667.html
Copyright © 2011-2022 走看看