[Python-ideas] Boolean parameters guidelines
Steven D'Aprano
steve at pearwood.info
Sun May 8 02:41:13 EDT 2016
On Sun, May 08, 2016 at 01:58:35AM -0300, Joao S. O. Bueno wrote:
> On 7 May 2016 at 22:59, Steven D'Aprano <steve at pearwood.info> wrote:
> > So instead there are two separate functions, variance and
> > pvariance.
>
> Which, to avoid copy and pasting code, would obviously each consist
> of a call do a _variance private function, passing the operation mode as a ...
> Boolean parameter.
You know, the standard library is open source, and the source code is
available :-) You could easily check to see whether that is what it
does:
https://hg.python.org/cpython/file/3.5/Lib/statistics.py
Ignoring docstrings, this is the current implementation of the two
functions:
def variance(data, xbar=None):
if iter(data) is data:
data = list(data)
n = len(data)
if n < 2:
raise StatisticsError('variance requires at least two data points')
T, ss = _ss(data, xbar)
return _convert(ss/(n-1), T)
def pvariance(data, mu=None):
if iter(data) is data:
data = list(data)
n = len(data)
if n < 1:
raise StatisticsError('pvariance requires at least one data point')
ss = _ss(data, mu)
T, ss = _ss(data, mu)
return _convert(ss/n, T)
So, no, it does not pass a hidden boolean argument. Virtually all the
common code (apart from some trivial setup code) is already factored
into private subfunctions, which I would have still done even if I had
used a bool to set the mode.
Even if I did use a private bool arg, I think that exposing it in the
public interface would have been the wrong choice. Conceptually, sample
variance and population variance are related but distinct things. It
makes for a better API to have two distinct functions rather than
passing a flag to choose between them.
There are cases where using a bool to select a mode makes sense, which
is why it is only a guideline, not a hard, unbending law that must
always be obeyed, no exceptions. There may be cases where we choose to
intentionally disregard the "No const bool args" rule, and that's
okay, if we disregard it for good reasons. For example, I think that
list.sort(reverse=True) is the right choice, in which case the other
rules about using keyword arguments apply. But I think that we should
start from a position of "No const bool args" being the preferred
option.
--
Steve
More information about the Python-ideas
mailing list