130 lines
2.7 KiB
ReStructuredText
130 lines
2.7 KiB
ReStructuredText
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
|
|
==========
|
|
|
|
.. [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.
|