pydecimal() - `min_value` and `max_value` should support `Decimal`, along with `float`
sshishov opened this issue · comments
- Faker version: 25.0.1
- OS: MacOS 14.4.1 (23E224)
After migrating to version 25+, profiding default value as Decimal
for min
or max
values causes violation
Steps to reproduce
amount=fake.pydecimal(min_value=Decimal(1), max_value=Decimal(100000)),
Expected behavior
The should not be any error observed. The rationale - a lot of software using Decimal from the box for all calculations, in the constants etc to rely on precise double calculation. Therefore I think that it should support Decimal from the box, especially if it is returning Decimal itself.
Actual behavior
Produces this mypy error:
error: Argument "min_value" to "pydecimal" of "Faker" has incompatible type "Decimal"; expected "float | None" [arg-type]
This is a typing issue, no "real" bug. Feel free to provide a PR to update the corresponding type hint and regenerate the typing stubs.
@stefan6419846 how I can report typing issues? Because we are havily using faker, and we are requiring strict
typing, that's why I have noticed these errors...
If you will give me a way to report typing issues, then I will report there.
It is indeed correct to report this here, but your initial report sounded like an implementation bug and not a type hint issue.
If we want to fix that, we can add more annotation in code
def pydecimal(
self,
left_digits: Optional[int] = None,
right_digits: Optional[int] = None,
positive: bool = False,
min_value: Optional[Union[float, int, Decimal]] = None,
max_value: Optional[Union[float, int, Decimal]] = None,
) -> Decimal:
but I think a problem is, we can have another types of numbers that are subclass of int or something like this,
how we can handle that in here?
Hi @parsariyahi , any subclass should be okay, I guess. We need to check though...
After some research, I found something, the built-in numbers
module, this module has a class Number
which is a abstract base class for all numbers I think.
you can read it here: https://docs.python.org/3/library/numbers.html
as the docs said:
The numbers module (PEP 3141) defines a hierarchy of numeric abstract base classes which progressively define more operations. None of the types defined in this module are intended to be instantiated.
I think it's fit the needs for this annotation
@parsariyahi using numbers.Number
seems like the right solution here. Do y ou have time to prepare a Pull Request?
@fcurella Yes sure, you can asign this issue to me, I will prepare a PR
turns out, Decimal
is not part of numbers.Number
.
I've tried using Union[Decimal, int, float]
, but looks like abs()
doesn't accept Decimal
, so the best I can do is to define a new type BasicNumber = [int, float]