[Python-ideas] contextlib.maybe

Julian Berman julian at grayvines.com
Sun Dec 11 06:07:23 CET 2011

Twice recently I've found myself wanting to write the following code:

    def fn(a_file=None):
        responsible_for_closing = False

        if a_file is None:
            a_file = open(a_default_location)
            responsible_for_closing = True


        if responsible_for_closing:

which can be written slightly shorter I know, but it's still a tiny bit
messy and repetitive. What I'd prefer to write is something more like:

    def fn(a_file=None):
        with contextlib.maybe(a_file, open, default) as a_file:

where `maybe` takes an object and conditionally runs a context manager
if a check fails. Implementation would be:

    def maybe(got, contextfactory, *args, checkif=bool, **kwargs):
        if checkif(got):
            yield got
            with contextfactory(*args, **kwargs) as got:
                yield got

It's hard to gauge utility for such simple functions (though contextlib
already has closing(), so I figured it'd be worth asking at least).
Would this be useful to others? Or perhaps I'm completely missing
something and you've got suggestions on how to better have an API where
an argument can be fetched if not provided but a context manager would
preferably need to be run to do so.

More information about the Python-ideas mailing list