Notice: While Javascript is not essential for this website, your interaction with the content will be limited. Please turn Javascript on for the full experience.

PEP 336 -- Make None Callable

PEP:336
Title:Make None Callable
Author:Andrew McClelland <eternalsquire at comcast.net>
Status:Rejected
Type:Standards Track
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, explictness, and necessity. The provided Switch example is nice but easily handled by a simple lambda definition. See python-dev discussion on 17 June 2005 [2].

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]Python Reference Manual, Section 3.2, http://docs.python.org/reference/
[2]Raymond Hettinger, Propose to reject PEP 336 -- Make None Callable https://mail.python.org/pipermail/python-dev/2005-June/054280.html
Source: https://github.com/python/peps/blob/master/pep-0336.txt