Python Enhancement Proposals

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


Contents

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 [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-discord/peps/blob/main/pep-0336.txt

Last modified: 2019-07-03 18:20:45 GMT