[Python-Dev] PEP 559 - built-in noop()
Victor Stinner
victor.stinner at gmail.com
Sat Sep 9 17:45:21 EDT 2017
Previous discussion: https://bugs.python.org/issue10049
Issue closed as rejected.
Victor
2017-09-09 14:33 GMT-07:00 Victor Stinner <victor.stinner at gmail.com>:
> I was able to find a real keyboard, so here is a more complete code:
> ---
> class Noop:
> def __call__(self, *args, **kw):
> return self
> def __enter__(self, *args, **kw):
> return self
> def __exit__(self, *args):
> return
> def __repr__(self):
> return 'nope'
> ---
>
> Example:
> ---
> noop = Noop()
> print(noop)
> print(noop())
> with noop() as nope:
> print(nope)
> with noop as well:
> print(well)
> ---
>
> Output:
> ---
> nope
> nope
> nope
> nope
> ---
>
> IHMO the real question is if we need a Noop.nope() method?
>
> Victor
>
> 2017-09-09 12:54 GMT-07:00 Victor Stinner <victor.stinner at gmail.com>:
>> I always wanted this feature (no kidding).
>>
>> Would it be possible to add support for the context manager?
>>
>> with noop(): ...
>>
>> Maybe noop can be an instance of:
>>
>> class Noop:
>> def __enter__(self, *args, **kw): return self
>> def __exit__(self, *args): pass
>> def __call__(self, *args, **kw): return self
>>
>> Victor
>>
>> Le 9 sept. 2017 11:48 AM, "Barry Warsaw" <barry at python.org> a écrit :
>>>
>>> I couldn’t resist one more PEP from the Core sprint. I won’t reveal where
>>> or how this one came to me.
>>>
>>> -Barry
>>>
>>> PEP: 559
>>> Title: Built-in noop()
>>> Author: Barry Warsaw <barry at python.org>
>>> Status: Draft
>>> Type: Standards Track
>>> Content-Type: text/x-rst
>>> Created: 2017-09-08
>>> Python-Version: 3.7
>>> Post-History: 2017-09-09
>>>
>>>
>>> Abstract
>>> ========
>>>
>>> This PEP proposes adding a new built-in function called ``noop()`` which
>>> does
>>> nothing but return ``None``.
>>>
>>>
>>> Rationale
>>> =========
>>>
>>> It is trivial to implement a no-op function in Python. It's so easy in
>>> fact
>>> that many people do it many times over and over again. It would be useful
>>> in
>>> many cases to have a common built-in function that does nothing.
>>>
>>> One use case would be for PEP 553, where you could set the breakpoint
>>> environment variable to the following in order to effectively disable it::
>>>
>>> $ setenv PYTHONBREAKPOINT=noop
>>>
>>>
>>> Implementation
>>> ==============
>>>
>>> The Python equivalent of the ``noop()`` function is exactly::
>>>
>>> def noop(*args, **kws):
>>> return None
>>>
>>> The C built-in implementation is available as a pull request.
>>>
>>>
>>> Rejected alternatives
>>> =====================
>>>
>>> ``noop()`` returns something
>>> ----------------------------
>>>
>>> YAGNI.
>>>
>>> This is rejected because it complicates the semantics. For example, if
>>> you
>>> always return both ``*args`` and ``**kws``, what do you return when none
>>> of
>>> those are given? Returning a tuple of ``((), {})`` is kind of ugly, but
>>> provides consistency. But you might also want to just return ``None``
>>> since
>>> that's also conceptually what the function was passed.
>>>
>>> Or, what if you pass in exactly one positional argument, e.g. ``noop(7)``.
>>> Do
>>> you return ``7`` or ``((7,), {})``? And so on.
>>>
>>> The author claims that you won't ever need the return value of ``noop()``
>>> so
>>> it will always return ``None``.
>>>
>>> Coghlin's Dialogs (edited for formatting):
>>>
>>> My counterargument to this would be ``map(noop, iterable)``,
>>> ``sorted(iterable, key=noop)``, etc. (``filter``, ``max``, and
>>> ``min`` all accept callables that accept a single argument, as do
>>> many of the itertools operations).
>>>
>>> Making ``noop()`` a useful default function in those cases just
>>> needs the definition to be::
>>>
>>> def noop(*args, **kwds):
>>> return args[0] if args else None
>>>
>>> The counterargument to the counterargument is that using ``None``
>>> as the default in all these cases is going to be faster, since it
>>> lets the algorithm skip the callback entirely, rather than calling
>>> it and having it do nothing useful.
>>>
>>>
>>> Copyright
>>> =========
>>>
>>> This document has been placed in the public domain.
>>>
>>>
>>> ..
>>> Local Variables:
>>> mode: indented-text
>>> indent-tabs-mode: nil
>>> sentence-end-double-space: t
>>> fill-column: 70
>>> coding: utf-8
>>> End:
>>>
>>>
>>> _______________________________________________
>>> Python-Dev mailing list
>>> Python-Dev at python.org
>>> https://mail.python.org/mailman/listinfo/python-dev
>>> Unsubscribe:
>>> https://mail.python.org/mailman/options/python-dev/victor.stinner%40gmail.com
>>>
>>
More information about the Python-Dev
mailing list