wyfo / apischema

JSON (de)serialization, GraphQL and JSON schema generation using Python typing.
https://wyfo.github.io/apischema/
MIT License
226 stars 18 forks source link

Strange behavior when registering `str` -> `float` conversion #622

Open FeldrinH opened 7 months ago

FeldrinH commented 7 months ago

Perhaps I am abusing conversions for something that they are not intended to handle, but I encountered a behavior that I found suprising and which feels like a bug.

I was trying to support deserializing floats from both floats and strings. I registered a converter like this:

@apischema.deserializer
def to_float(value: str) -> float:
    return float(value)

And then tried this:

@dataclass
class Data:
    a: float
    b: float

result = apischema.deserialize(Data, {
    "a": 1.23,
    "b": "1.23",
})
print(result)

The result was, ValidationError: [{'loc': ['a'], 'err': 'expected type string, found number'}], which is a little suprising, because it seems that adding a converter from string to float has made deserializing a float to itself invalid.

PS: I also tried adding a converter from float to float. That caused RecursionError: maximum recursion depth exceeded.