Fully agreed on the sentiment that we shouldn't treat compile-time literals differently from runtime operations. It has no precedent in Python and adds a significant mental burden to keep track of. I can only imagine the deluge StackOverflow threads from surprised users if this were to be done.

That said, I also really like the idea of better Python support for symbolic and decimal math.

How about this as a compromise:

`from __feature__ import decimal_math, fraction_math`

With the 2 interpreter directives above (which must appear at the top of the module, either before or after __future__ imports, but before anything else), any float literals inside that module would be automatically coerced to `Decimal`, and any division operations would be coerced to `Fraction`. You could also specify just one of those directives if you wanted.

Upsides
 - No change at all to existing code
 - By specifically opting into this behavior you would be accepting the reduced performance and memory-efficiency
 - Very simple to explain to people using Python for maths or science (not an insignificant userbase) who don't understand or care about the merits and downsides of various data-types and just want to do math that behaves the way they expect.

Downsides:
 - the complexity of adding this new '__feature__' interpreter directive, although it *should* be possibly to reuse the existing __future__ machinery for it
 - having to maintain these new 'features' into the future
 - you can't choose to mark a single float literal as a decimal or a single division operation as a fraction, it's all-or-nothing within a given module

I don't know. It was just an idea off the top of my head. On second thought, maybe it's needlessly contrived.

Cheers everyone

On Tue, May 18, 2021 at 4:05 PM Ricky Teachey <ricky@teachey.org> wrote:
On Tue, May 18, 2021 at 10:55 AM Paul Moore <p.f.moore@gmail.com> wrote:
On Tue, 18 May 2021 at 15:16, Martin Teichmann
<martin.teichmann@gmail.com> wrote:
>
> Because reality. People would like to write 1/2 * m * v**2 to mean the obvious thing, without having to think about the details. And there are many people like this, this is why it shows up on this mailing list regularly. I have never felt the urge to write two/three * m * v**two.

I'd actually prefer to write (m*v**2)/2. Or (m/2)*v**2. But those
wouldn't work, the way you describe your proposal. And I'd be very
concerned if they behaved differently than 1/2 * m * v**2...

Paul

A much more concrete way of making the point I was trying to make!

Different results from:

 >>> one = 1
 >>> three = 3
 >>> one/three

..and:

 >>> 1/3

... has to be avoided. I don't see how it can be with the way the proposal has been described.

---
Ricky.

"I've never met a Kentucky man who wasn't either thinking about going home or actually going home." - Happy Chandler
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-leave@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/OKMGLONWE2MMV3S6EJF76QEAIHYHQHAZ/
Code of Conduct: http://python.org/psf/codeofconduct/