22 lines
No EOL
717 B
Python
22 lines
No EOL
717 B
Python
from decimal import Decimal
|
|
from typing import Union
|
|
|
|
def decimal_encoder(dec_value: Decimal) -> Union[int, float]:
|
|
"""Encodes a Decimal as int of there's no exponent, otherwise float.
|
|
|
|
This is useful when we use ConstrainedDecimal to represent Numeric(x,0)
|
|
where a integer (but not int typed) is used. Encoding this as a float
|
|
results in failed round-tripping between encode and parse.
|
|
Our Id type is a prime example of this.
|
|
|
|
>>> decimal_encoder(Decimal("1.0"))
|
|
1.0
|
|
|
|
>>> decimal_encoder(Decimal("1"))
|
|
1
|
|
"""
|
|
exponent = dec_value.as_tuple().exponent
|
|
if isinstance(exponent, int) and exponent >= 0:
|
|
return int(dec_value)
|
|
else:
|
|
return float(dec_value) |