For example, we override the __str__
method in Decimal
then call it two different ways
from decimal import Decimal
class D(Decimal):
def __str__(self):
return super().normalize().__str__()
num = D('1.0')
print(f"{num}")
print(f"{str(num)}")
outputs
1.0
1
But they should both output 1
. It seems like the first print
is calling Decimal.__str__
instead of D.__str__
for some reason. Why does this happen and how do I fix the behavior?
You'll need to override __format__
too (see the f-string PEP, search for __format__
).
from decimal import Decimal
class D(Decimal):
def __str__(self):
return super().normalize().__str__()
def __format__(self, format_spec):
return super().normalize().__format__(format_spec)
num = D('1.0')
print(f"{num}")
print(f"{str(num)}")
prints out
1
1