[Python-Dev] PEP 559 - built-in noop() (original) (raw)

Nick Coghlan ncoghlan at gmail.com
Thu Nov 23 20:17:43 EST 2017


On 24 November 2017 at 01:49, Barry Warsaw <barry at python.org> wrote:

On Nov 22, 2017, at 19:32, Victor Stinner <victor.stinner at gmail.com> wrote: > > Aha, contextlib.nullcontext() was just added, cool!

So, if I rewrite PEP 559 in terms of decorators it won’t get rejected?

The conceptual delta between knowing how to call "noop()" and how to write "def noop(): pass" is just a teensy bit smaller than that between knowing how to use:

with nullcontext(value) as var:
    ...

and how to write:

@contextlib.contextmanager
def nullcontext(enter_result):
    yield enter_result

or:

class nullcontext(object):
    def __init__(self, enter_result):
        self.enter_result = enter_result
    def __enter__(self):
        return self.enter_result
    def __exit__(self, *args):
        pass

So the deciding line for me was "Should people need to know how to write their own context managers in order to have access to a null context manager?", and I eventually decided the right answer was "No", since the context management protocol is actually reasonably tricky conceptually, and even the simplest version still requires knowing how to use decorators and generators (as well as knowing which specific decorator to use).

The conceptual step between calling and writing functions is much smaller, and defining your own re-usable functions is a more fundamental Python skill than defining your own context managers.

And while I assume you were mostly joking, the idea of a "@functools.stub_call(result=None)" decorator to temporarily replace an otherwise expensive function call could be a genuinely interesting primitive. unittest.mock and other testing libraries already have a bunch of tools along those lines, so the principle at work there would be pattern extraction based on things people already do for themselves.

Cheers, Nick.

-- Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.python.org/pipermail/python-dev/attachments/20171124/e668e5d6/attachment.html>



More information about the Python-Dev mailing list