File: optional_with.py

package info (click to toggle)
llvm-toolchain-4.0 1%3A4.0.1-10~deb9u2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 493,332 kB
  • sloc: cpp: 2,698,100; ansic: 552,773; asm: 128,821; python: 121,589; objc: 105,054; sh: 21,174; lisp: 6,758; ml: 5,532; perl: 5,311; pascal: 5,245; makefile: 2,083; cs: 1,868; xml: 686; php: 212; csh: 117
file content (58 lines) | stat: -rw-r--r-- 1,733 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# ====================================================================
# Provides a with-style resource handler for optionally-None resources
# ====================================================================


class optional_with(object):
    # pylint: disable=too-few-public-methods
    # This is a wrapper - it is not meant to provide any extra methods.
    """Provides a wrapper for objects supporting "with", allowing None.

    This lets a user use the "with object" syntax for resource usage
    (e.g. locks) even when the wrapped with object is None.

    e.g.

    wrapped_lock = optional_with(thread.Lock())
    with wrapped_lock:
        # Do something while the lock is obtained.
        pass

    might_be_none = None
    wrapped_none = optional_with(might_be_none)
    with wrapped_none:
        # This code here still works.
        pass

    This prevents having to write code like this when
    a lock is optional:

    if lock:
        lock.acquire()

    try:
        code_fragment_always_run()
    finally:
        if lock:
            lock.release()

    And I'd posit it is safer, as it becomes impossible to
    forget the try/finally using optional_with(), since
    the with syntax can be used.
    """

    def __init__(self, wrapped_object):
        self.wrapped_object = wrapped_object

    def __enter__(self):
        if self.wrapped_object is not None:
            return self.wrapped_object.__enter__()
        else:
            return self

    def __exit__(self, the_type, value, traceback):
        if self.wrapped_object is not None:
            return self.wrapped_object.__exit__(the_type, value, traceback)
        else:
            # Don't suppress any exceptions
            return False