Chinaunix首页 | 论坛 | 博客
  • 博客访问: 488886
  • 博文数量: 74
  • 博客积分: 750
  • 博客等级: 军士长
  • 技术积分: 1453
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-29 15:59
文章分类
文章存档

2014年(30)

2013年(8)

2012年(36)

分类: Python/Ruby

2014-08-28 08:05:47

Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,
你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。
例如:在没有with语句中的语句中的方法中我们可以看到对文件的处理方法(1)
file =   open("root/younamefolder/tmp/file.txt")
data = file.read()
file.close()

缺点是:在我们打开文件时,没有对异常进行处理,在文件处理结束后可能会对文件忘记进行关闭处理。

例如2:
在对异常进行处理的代码:
file =   open("root/younamefolder/tmp/file.txt")
try:
    
data = file.read()
finally:
    
file.close()
这样的好处就是我们在这里进行了异常处理的方法,但是在python这个惜字如金的编写程序的方式中。这样的
代码书写劣显有点冗余。
在使用我们的with语句中。我们会发现这个问题就很easy了。
with  open("root/younamefolder/tmp/file.txt") as file:
        data = file.read()

下面有一些我们关于with使用的一些技巧:
    
 这看起来充满魔法,但不仅仅是魔法,Python对with的处理还很聪明。基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。
紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法
下面例子可以具体说明with如何工作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python
# with_example01.py
 
 
class Sample:
    def __enter__(self):
        print "In __enter__()"
        return "Foo"
 
    def __exit__(self, type, value, trace):
        print "In __exit__()"
 
 
def get_sample():
    return Sample()
 
 
with get_sample() as sample:
    print "sample:", sample
When executed, this will result in: 运行代码,输出如下
1
2
3
4
bash-3.2$ ./with_example01.py
In __enter__()
sample: Foo
阅读(2490) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~