PEP: 336 Title: Make None Callable Version: $Revision$ Last-Modified:
$Date$ Author: Andrew McClelland <eternalsquire@comcast.net> 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

Copyright

This document has been placed in the public domain.

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