On Wed, 14 Oct 2015 21:57 Laura Creighton <lac@openend.se> wrote:

In a message of Wed, 14 Oct 2015 08:38:43 -0700, Guido van Rossum writes:
>Perhaps you could solve this with type variables. Here's a little
>demonstration program:
>```
>from decimal import Decimal
>from typing import TypeVar
>F = TypeVar('F', float, Decimal)
>def add(a: F, b: F) -> F:
>    return a+b
>print(add(4.2, 3.14))
>print(add(Decimal('4.2'), Decimal('3.14')))
>print(add(Decimal('4.2'), 3.14))
>```
>Note that the last line is invalid. mypy correctly finds this:
>```
>flt.py:8: error: Type argument 1 of "add" has incompatible value "object"
>```
>(We could work on the error message.)
>
>Now, I'm not sure that this is the best solution given the audience -- but
>the type variable 'F' only needs to be defined once, so this might actually
>work.
>
>--
>--Guido van Rossum (python.org/~guido)

This looks good to me.  I wonder if there is anything we can do,
documentation and PEP wise to encourage people who write code
to use it, rather than just using float?



It's not always appropriate though. If the author types it as float then they're obviously not thinking about decimal in which case it may not work correctly for decimal. Writing accurate numerical code that ducktypes with float and decimal is non-trivial even in cases where the operation is relatively trivial. Personally I just wouldn't mix them but if you want to see how tricky it can be take a look at statistics.sum.

Generally if it's possible to interchange floats and decimals in your code then there's probably no need for decimals in the first place. If mypy requires you to do an explicit conversion to float then there may be some seld-documenting merit in showing that conversion up front rather than assuming that it's okay to insert decimals where they're not expected. The point of static type checking is to detect precisely these kinds of errors.

--
Oscar