`
jianpx
  • 浏览: 171169 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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:

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

#!/usr/bin/env python

from __future__ import with_statement 

filename = 'for_test.txt'

def output(content):
    print content

#functio solution
def controlled_execution(func):
    #prepare thing
    f = None
    try:
        #set thing up
        f = open(filename, 'r')
        content = f.read()
        if not callable(func):
            return
        #deal with thing 
        func(content)

    except IOError, e:
        print 'Error %s' % str(e)

    finally:
        if f: 
            #tear thing down
            f.close()

def test():
    controlled_execution(output)

test()
 

方法2:

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

代码片段如下:

#yield solution
def controlled_execution():
    f = None
    try:
        f = open(filename, 'r')
        thing = f.read()
        #for thing in f:
        yield thing
    except IOError,e:
        print 'Error %s' % str(e)
    finally:
        if f: 
            f.close()

def test2():
    for content in controlled_execution():
        output(content)

 

方法3:

用类的方式加上with实现。

代码片段如下:

#class solution
class controlled_execution(object):
    def __init__(self):
        self.f = None
        
    def __enter__(self):
        try:
            f = open(filename, 'r')
            content = f.read()
            return content
        except IOError ,e:
            print 'Error %s' % str(e)
            #return None

    def __exit__(self, type, value, traceback):
        if self.f:
            print 'type:%s, value:%s, traceback:%s' % \
                    (str(type), str(value), str(traceback))
            self.f.close()

def test3():
    with controlled_execution() as thing:
        if thing:
            output(thing)

 

方法4:

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

def test4():
    with open(filename, 'r') as f:
        output(f.read())

    print f.read()

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

 

 

 

 

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

6
1
分享到:
评论
3 楼 lxw0109 2014-09-05  
这个确实棒啊!给力!
2 楼 enloyee 2011-11-23  
NeuronR 写道
请教最后一个例子,
with
块结束后, python 解释器如何确定该调
f.close()
? 通过反射吗?
如果我想自己定义一个管理文件资源的类型, 需要在这个类型中定义什么能够使解释器在退出
with
块时去 "析构" 这个对象从而释放对象所管理的资源?


任何支持with的类都必须实现__enter__和__exit__,只是自己定义的类需要自己实现。最后一个例子不过是系统提供的文件对象已经把这两个函数帮你实现罢了。和第三个没什么区别。
1 楼 NeuronR 2010-11-21  
请教最后一个例子,
with
块结束后, python 解释器如何确定该调
f.close()
? 通过反射吗?
如果我想自己定义一个管理文件资源的类型, 需要在这个类型中定义什么能够使解释器在退出
with
块时去 "析构" 这个对象从而释放对象所管理的资源?

相关推荐

    Python 学习

    例如,异常处理(try-except)、装饰器(decorator)和上下文管理器(with statement)都是进阶主题。异常处理用于捕获和处理程序运行时可能出现的错误,装饰器可以增强或修改函数的行为,而上下文管理器提供了一种...

    python第26天python-Day26.rar

    5. **文件操作**:读写文件是常见的任务,你可能学习了使用`open()`函数打开文件,`read()`、`write()`、`writelines()`等方法进行数据的读取和写入,以及文件对象的上下文管理器(with statement)。 6. **正则...

    《Python 程序设计》 张莉主编课后习题答案.zip

    8. **高级主题**:随着学习的深入,可能会接触到装饰器(decorator)、生成器(generator)、上下文管理器(with statement)等高级特性,这些都是Python独特且强大的工具。 通过解答《Python程序设计》的课后习题...

    python基础教程至60课(基础).docx

    - **知识点概述**:理解变量的概念,学会如何定义和使用变量。 - **详细内容**:变量是存储数据值的容器。在Python中,变量无需显式声明类型,直接赋值即可。例如,`age = 25`定义了一个名为`age`的变量,并为其赋值...

    poradniki-python

    - 上下文管理器(with statement):用于资源的自动获取和释放,如文件操作。 - 列表推导式和字典推导式:简洁地创建新的列表或字典。 - 生成器(generator):使用`yield`关键字创建迭代器,节省内存。 6. **...

    脚本

    综上所述,“脚本”这个主题涵盖了Python编程的基础到进阶知识,从简单的数据类型和控制结构到面向对象编程、文件操作以及模块使用。无论你是初学者还是经验丰富的开发者,掌握这些知识都将对你的IT职业生涯产生积极...

    Hackerrank

    - 上下文管理器(with statement):用于自动管理资源的开销,如文件操作。 - 广度优先搜索(BFS)和深度优先搜索(DFS):常用在图和树的遍历问题中。 3. **算法和数据结构**: - 排序算法:冒泡排序、选择排序...

    code-with-girlscript-bangalore:此存储库是GirlScript Bangalore的一部分。 在这里,我们提出了集思广益的编码问题,可帮助您成为更好的编码员。 难度问题的范围从初学者到高级,每个人都可以做出贡献。 因此,继续编码并继续贡献力量!

    在【Python】方面,你可以期待找到各种难度级别的编程问题,涵盖基础语法、数据结构(如列表、元组、字典)、控制流(if-else、for、while循环)、函数、类和对象等。对于进阶者,可能涉及到异常处理、模块导入、...

    IDEA快捷键IntelliJIDEAkeymap

    IntelliJ IDEA 是一款流行的集成开发环境(IDE),广泛应用于Java、Kotlin、Python等多种编程语言的开发。为了提高开发效率,IntelliJ IDEA 提供了丰富的快捷键映射(keymap),这些快捷键映射允许用户通过键盘快捷...

Global site tag (gtag.js) - Google Analytics