zoukankan      html  css  js  c++  java
  • 【跟我一起学Python吧】python with statement 进阶理解

    由于之前有一个项目老是要打开文件,然后用pickle.load(file),再处理。。。最后要关闭文件,所以觉得有点繁琐,代码也不简洁。所以向python with statement寻求解决方法。以下是开发笔记

    在网上看到一篇文章:http://effbot.org/zone/python-with-statement.htm是介绍with 的,参考着例子进行了理解。

    如果经常有这么一些代码段的话,可以用一下几种方法改进:

    代码段:

    set thing up

    try:

        do something

    except :

        handle exception

    finally:

        tear thing down

    案例1:

    假如现在要实现这么一个功能,就是打开文件,从文件里面读取数据,然后打印到终端,之后关闭文件。

    那么从逻辑上来说,可以抽取“打印到终端”为数据处理部分,应该可以独立开来作为一个函数。其他像打开、关闭文件应该是一起的。

    文件名为:for_test.txt

    方法1:

    用函数,把公共的部分抽取出来。

    Python代码  收藏代码
    1. #!/usr/bin/env python  
    2.   
    3. from __future__ import with_statement   
    4.   
    5. filename = 'for_test.txt'  
    6.   
    7. def output(content):  
    8.     print content  
    9.   
    10. #functio solution  
    11. def controlled_execution(func):  
    12.     #prepare thing  
    13.     f = None  
    14.     try:  
    15.         #set thing up  
    16.         f = open(filename, 'r')  
    17.         content = f.read()  
    18.         if not callable(func):  
    19.             return  
    20.         #deal with thing   
    21.         func(content)  
    22.   
    23.     except IOError, e:  
    24.         print 'Error %s' % str(e)  
    25.   
    26.     finally:  
    27.         if f:   
    28.             #tear thing down  
    29.             f.close()  
    30.   
    31. def test():  
    32.     controlled_execution(output)  
    33.   
    34. test()  

    方法2:

    用yield实现一个只产生一项的generator。通过for - in 来循环。

    代码片段如下:

    Python代码  收藏代码
    1. #yield solution  
    2. def controlled_execution():  
    3.     f = None  
    4.     try:  
    5.         f = open(filename, 'r')  
    6.         thing = f.read()  
    7.         #for thing in f:  
    8.         yield thing  
    9.     except IOError,e:  
    10.         print 'Error %s' % str(e)  
    11.     finally:  
    12.         if f:   
    13.             f.close()  
    14.   
    15. def test2():  
    16.     for content in controlled_execution():  
    17.         output(content)  

    方法3:

    用类的方式加上with实现。

    代码片段如下:

    Python代码  收藏代码
    1. #class solution  
    2. class controlled_execution(object):  
    3.     def __init__(self):  
    4.         self.f = None  
    5.           
    6.     def __enter__(self):  
    7.         try:  
    8.             f = open(filename, 'r')  
    9.             content = f.read()  
    10.             return content  
    11.         except IOError ,e:  
    12.             print 'Error %s' % str(e)  
    13.             #return None  
    14.   
    15.     def __exit__(self, type, value, traceback):  
    16.         if self.f:  
    17.             print 'type:%s, value:%s, traceback:%s' %   
    18.                     (str(type), str(value), str(traceback))  
    19.             self.f.close()  
    20.   
    21. def test3():  
    22.     with controlled_execution() as thing:  
    23.         if thing:  
    24.             output(thing)  

    方法4:

    用with实现。不过没有exception handle 的功能。

    Python代码  收藏代码
    1. def test4():  
    2.     with open(filename, 'r') as f:  
    3.         output(f.read())  
    4.   
    5.     print f.read()  

     最后一句print是用来测试f是否已经被关闭了。

      

        最后总结一下,写这篇文章的目的主要是受了一句话的刺激:“使用语言的好特性,不要使用那些糟糕的特性”!python真是有很多很优雅的好特性,路漫漫其修远兮,吾将上下而求索。。。

  • 相关阅读:
    好用的绘图工具推荐-processon
    前台获取到的后台json对象取值时undefined的解决方法
    axios怎么引用?
    postman发送post请求,后端无法接收到参数
    bcrypt加密算法
    mongoose创建model名字时,为什么集合名会自动加s?
    《遇见未知的自己》 张德芬
    《把时间当做朋友》笔记摘要
    精英与普通人的区别
    金刚经全文
  • 原文地址:https://www.cnblogs.com/rrxc/p/3928516.html
Copyright © 2011-2022 走看看