PEP: 336
Title: Make None Callable
Version: $Revision$
Last-Modified: $Date$
Author: Andrew McClelland <[email protected]>
Status: Rejected
Type: Standards Track
Content-Type: text/x-rst
Created: 28-Oct-2004
Post-History:


Abstract
========

``None`` should be a callable object that when called with any
arguments has no side effect and returns ``None``.


BDFL Pronouncement
==================

This PEP is rejected.  It is considered a feature that ``None`` raises
an error when called.  The proposal falls short in tests for
obviousness, clarity, explicitness, and necessity.  The provided Switch
example is nice but easily handled by a simple lambda definition.
See python-dev discussion on 17 June 2005 [1]_.


Motivation
==========

To allow a programming style for selectable actions that is more
in accordance with the minimalistic functional programming goals
of the Python language.


Rationale
=========

Allow the use of ``None`` in method tables as a universal no effect
rather than either (1) checking a method table entry against ``None``
before calling, or (2) writing a local no effect method with
arguments similar to other functions in the table.

The semantics would be effectively::

   class None:

       def __call__(self, *args):
           pass


How To Use
==========

Before, checking function table entry against ``None``::

   class Select:

       def a(self, input):
           print 'a'

       def b(self, input):
           print 'b'

       def c(self, input):
           print 'c'

       def __call__(self, input):
        function = { 1 : self.a,
              2 : self.b,
              3 : self.c
           }.get(input, None)
        if function:  return function(input)

Before, using a local no effect method::

   class Select:

       def a(self, input):
           print 'a'

       def b(self, input):
           print 'b'

       def c(self, input):
           print 'c'

       def nop(self, input):
        pass

       def __call__(self, input):
           return { 1 : self.a,
           2 : self.b,
           3 : self.c
           }.get(input, self.nop)(input)

After::

   class Select:

       def a(self, input):
           print 'a'

       def b(self, input):
           print 'b'

       def c(self, input):
           print 'c'

       def __call__(self, input):
        return { 1 : self.a,
           2 : self.b,
           3 : self.c
           }.get(input, None)(input)


References
==========

. [1] Raymond Hettinger, Propose to reject PEP 336 -- Make None Callable
      https://mail.python.org/pipermail/python-dev/2005-June/054280.html


Copyright
=========

This document has been placed in the public domain.