[Python-Dev] Symmetry arguments for API expansion
Steven D'Aprano
steve at pearwood.info
Wed Mar 21 19:02:49 EDT 2018
On Wed, Mar 21, 2018 at 09:46:06AM -0700, Nathaniel Smith wrote:
[...]
> For me this is an argument against is_integer() rather than for it :-).
> is_prime(float) should *obviously*[1] be a TypeError. Primality is only
> meaningfully defined over the domain of integers
And 3.0 is an integer. Just because it is float *object* does not mean
it is not an integer *value*. Do not mistake the leaky abstraction of
multiple numeric types for the mathematical number three.
Primality-related functions are not limited to integers. For example,
the prime counting function is defined on the reals:
https://en.wikipedia.org/wiki/Prime-counting_function
and there's no reason not to extend the domain of is_prime to any real.
"Practicality beats purity" -- why should the result be different just
because the input has a ".0" at the end?
Mathematically it doesn't: the answer to something like "Is 3.0 a
prime?" is a clear Yes, not "I'm sorry, I don't understand the
question!" which an exception would imply.
As programmers, there is always a tension between the leaky abstraction
of our numeric types, and the mathematical equality of:
3 == 3.0 == 9/3 == 3+0j
etc. The decision on whether to be more or less restrictive on the
*types* a function accepts is up to the individual developer. Having
decided to be *less* restrictive, an is_integer method would be useful.
For what it's worth, Wolfram|Alpha gives inconsistant results. It allows
testing of rationals for primality:
"Is 9/3 a prime?"
evaluates as true, but:
"Is 3.0 a prime?"
gets parsed as "Is 3 a prime number?" and yet evaluates as false. A
clear bug for software using a natural-language interface and intended
to be used by students and non-mathematicans.
> and this is a case where
> operator.index is exactly what you want.
It is exactly not what I want.
> Of course it's just an example, and perhaps there are other, better
> examples. But it makes me nervous that this is the best example you could
> quickly come up with.
I actually had to work hard to come up with an example as simple and
understandable as primality testing. The first example I thought of was
Bessel functions of the 1st and 2nd kind with arbitrary real-valued
orders, where you *absolutely* do want order 3.0 (float) and order 3
(int) to be precisely the same.
But I avoided giving it because I thought it would be too technical and
it would intimidate people. I thought that the prime number example
would be easier to understand.
Next time I want to make a point, I'll go for argument by intimidation.
*wink*
--
Steve
More information about the Python-Dev
mailing list