python自学我爱编程

python 实现上下文管理功能

2018-05-28  本文已影响15人  洛克黄瓜

上下文是什么?

# -*- coding: utf-8 -*-
"""什么是上下文,看下下面的例子先"""

f = open('hello.txt', 'w')
try:
    f.write('hello, world')
finally:
    f.close()

with open('hello.txt', 'w') as f:
    f.write('hello, world!')

通过类做一个上下文,来处理文件编辑

# -*- coding: utf-8 -*-
"""自己实现一个处理文本的上下文处理器, 我们用来写个文件"""

class ManageFile(object):

    def __init__(self, file_name, handle):
        self.file_name = file_name
        self.handle = handle
    
    def __enter__(self):
        self.file = open(self.file_name, self.handle)
        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.file:
            self.file.close()

with ManageFile('hello.txt', 'w') as f:
    f.write('haha')

通过contextlib库来做一个上下文,来处理文件编辑

# -*- coding: utf-8 -*-
"""通过contextlib实现一个上下文处理器"""

from contextlib import contextmanager

@contextmanager
def manage_file(file_name, handle):
    try:
        f = open(file_name, handle)
        yield f
    finally:
        f.close()

with manage_file('hello2.txt', 'w') as f:
    f.write('hello2')

福利:用上下文来实现排版打印

# -*- coding: utf-8 -*-
"""利用上下文实现间隔打印"""

class Indenter(object):
    def __init__(self):
        self.level = 0

    def __enter__(self):
        self.level += 1
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.level -= 1

    def print_(self, text):
        print '    ' * self.level + text

with Indenter() as indent:
    indent.print_('hi!')
    with indent:
        indent.print_('locke')
        with indent:
            indent.print_('cucumnber')
    indent.print_('over')
上一篇 下一篇

猜你喜欢

热点阅读