[Python-Dev] Mixing float and Decimal -- thread reboot
Stefan Krah
stefan at bytereef.org
Tue Mar 23 16:09:50 CET 2010
Mark Dickinson <dickinsm at gmail.com> wrote:
> > I like the simplicity of having a single signal (e.g. CoercionError), but
> > a strictness context flag could offer greater control for people who only
> > want pure decimal/integer operations.
>
> Sounds worth considering.
>
> > For example:
> >
> > strictness 0: completely promiscuous behaviour
> >
> > strictness 1: current py3k behaviour
> >
> > strictness 2: current py3k behaviour + pure equality comparisons
>
> Can you explain what you mean by "+ pure equality comparisons" here?
> If I'm understanding correctly, this is a mode that's *more* strict
> than the current py3k behaviour; what's it disallowing that the
> current py3k behaviour allows?
It's disallowing all comparisons between e.g. float and decimal. The idea
is that the context can provide a cheap way of enforcing types for people
who like it:
>>> from decimal import *
>>> DefaultContext.strictness = 1
>>> Decimal(9) == 9.0
False
>>> Decimal(9) in [1, 4.0 ,9]
True
>>> DefaultContext.strictness = 2
>>> Decimal(9) == 9.0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/stefan/svn/py3k/Lib/decimal.py", line 858, in __eq__
other = _convert_other(other)
File "/home/stefan/svn/py3k/Lib/decimal.py", line 5791, in _convert_other
raise TypeError("Unable to convert %s to Decimal" % other)
TypeError: Unable to convert 9.0 to Decimal
>>> Decimal(9) in [1, 4.0 ,9]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/stefan/svn/py3k/Lib/decimal.py", line 858, in __eq__
other = _convert_other(other)
File "/home/stefan/svn/py3k/Lib/decimal.py", line 5791, in _convert_other
raise TypeError("Unable to convert %s to Decimal" % other)
TypeError: Unable to convert 4.0 to Decimal
>>> Decimal(9) in [1, 4 ,9]
True
This mode could help catch bugs like:
n = 7 / 3 # Programmer thinks this is an integer
x = Decimal(100)
while x != n:
pass # do something
x -= 1
> > strictness 3: current py3k behaviour + pure equality comparisons +
> > disallow NaN equality comparisons [1]
>
> Sorry, no. I think there are good reasons for the current NaN
> equality behaviour: 2.0 really *isn't* a NaN, and Decimal(2) ==
> Decimal('nan') should return False rather than raising an exception.
> And the decimal module provides compare and compare_signal for those
> who want complete standards-backed control here.
I'd like to make it an option for people who don't want to write:
while x.compare_signal(7) != 0
And I think that an sNaN should really signal by default.
> Besides, this seems
> to me to be an orthogonal issue to the issue of mixing Decimal with
> other numeric types.
Yes, it would kind of overload the strictness parameter. I see it as another
type of strictness, so I brought it up here. Level 3 would be a bit like
the highest warning level of a compiler.
But of course there's no need to discuss NaNs further in this thread other
than to show a possible use of the flag.
Stefan Krah
More information about the Python-Dev
mailing list