contextlib.closing
Some things should be closed after the use. Some of them are provided as context managers (open is a notable example), and some of them aren't (say, socket.socket).
Writing such context manager is trivial:
@contextmanager
def socket_context(*args, **kwargs):
try:
sock = socket(*args, **kwargs)
yield sock
finally:
sock.close()
To avoid writing a context manager for every type of closing object , you can you universal contextlib.closing:
with closing(socket.socket(socket.AF_INET6)) as sock:
sock.connect(addr)
sock.sendall(data)
If you still like to have a socket_context name, but don't want to write the monotonous try-yield-finally-close, you should wrap closing:
def socket_context(*args, **kwargs):
return closing(socket.socket(*args, **kwargs))