Skip to content

Latest commit

 

History

History
84 lines (65 loc) · 2.1 KB

day16.md

File metadata and controls

84 lines (65 loc) · 2.1 KB

第十六天

索引

python标准库 contextlib

  1. Context Manager API
class WithinContext:

    def __init__(self, context):
        print('WithinContext.__init__({})'.format(context))

    def do_something(self):
        print('WithinContext.do_something()')

    def __del__(self):
        print('WithinContext.__del__')


class Context:

    def __init__(self):
        print('Context.__init__()')

    def __enter__(self):
        print('Context.__enter__()')
        return WithinContext(self)

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('Context.__exit__()')


with Context() as c:
    c.do_something()
  1. From Generator to Context Manager
import contextlib


@contextlib.contextmanager
def make_context():
    print('  entering')
    try:
        yield {}
    except RuntimeError as err:
        print('  ERROR:', err)
    finally:
        print('  exiting')


print('Normal:')
with make_context() as value:
    print('  inside with statement:', value)

print('\nHandled error:')
with make_context() as value:
    raise RuntimeError('showing example of handling an error')

print('\nUnhandled error:')
with make_context() as value:
    raise ValueError('this exception is not handled')

from contextlib import contextmanager

@contextmanager
def opened(filename, mode="r"):
    file = open(filename, mode)
    print('start')
    try:
        yield file
    finally:
        file.close()
        print('end')

with opened("/etc/passwd") as f:
    for line in f:
        print(line.strip())