Comments (4)
Hey @lovasoa , I'm encountering this issue again when trying to implement a schema that has a field of type uuid.UUID
with a default_factory=uuid.uuid4
...
Basically, the concept of default
has changed between marshmallow 2.x and 3.x... For a dataclass
you obviously want your default
or default_factory
to be a "deserialized" type like UUID
or datetime
--something you want to use in your code. However for marshmallow 2.x your a field's default
attribute actually correspond to the serialized output type. Here's a snippet from the codebase of marshmallow 2.x that shows serialize()
just output the raw field.default
value.
def serialize(self, attr, obj, accessor=None):
"""Pulls the value for the given key from the object, applies the
field's formatting and returns the result.
:param str attr: The attibute or key to get from the object.
:param str obj: The object to pull the key from.
:param callable accessor: Function used to pull values from ``obj``.
:raise ValidationError: In case of formatting problem
"""
if self._CHECK_ATTRIBUTE:
value = self.get_value(attr, obj, accessor=accessor)
if value is missing_:
if hasattr(self, 'default'):
if callable(self.default):
return self.default()
else:
return self.default
else:
value = None
return self._serialize(value, attr, obj)
And notice the difference in 3.x
def serialize(self, attr, obj, accessor=None, **kwargs):
"""Pulls the value for the given key from the object, applies the
field's formatting and returns the result.
:param str attr: The attribute or key to get from the object.
:param str obj: The object to pull the key from.
:param callable accessor: Function used to pull values from ``obj``.
:param dict kwargs': Field-specific keyword arguments.
:raise ValidationError: In case of formatting problem
"""
if self._CHECK_ATTRIBUTE:
value = self.get_value(obj, attr, accessor=accessor)
if value is missing_ and hasattr(self, 'default'):
default = self.default
value = default() if callable(default) else default
if value is missing_:
return value
else:
value = None
return self._serialize(value, attr, obj, **kwargs)
In 3.x self.default is used as a value that gets passed to self._serialize()
What do you think we should do about this?
from marshmallow_dataclass.
Actually, this 2.x vs 3.x changelog post captures the issue: https://marshmallow.readthedocs.io/en/3.0/upgrading.html#missing-and-default-field-parameters-are-passed-in-deserialized-form
from marshmallow_dataclass.
@evanfwelch : I am not sure I understand why this would be a problem in marshmallow_dataclass ? The default
values are simply passed to marshmallow. It is then up to the user to use whatever value is compatible with the marshmallow version they are using. That is, with marshmallow 3, they would write
@dataclass
class Params:
date_i_need: date = field(default=date(2018,1,1))
and with marshmallow 2:
@dataclass
class Params:
date_i_need: date = field(default="2018-01-01")
from marshmallow_dataclass.
@lovasoa you're right, this isn't an issue w/ marshmallow_dataclass. I initially misunderstood the fact that marshmallow expects missing
and default
to be in the same form (either serialized in 2.x or deserialized in 3.x) and I thought that marshmallow_dataclass
was erroneously blending this distinction by assigning both to the default value of the dataclass.field
. I'm going to close this, thank you for the attention to it.
from marshmallow_dataclass.
Related Issues (20)
- Add native marshmallow.fields.Enum suport HOT 1
- str | None fails HOT 5
- Enum parameters are ignored when loading a schema HOT 3
- field_for_schema can use _RECURSION_GUARD.seen_classes before it is initialized
- TypeError when creating a marshmallow schema from dataclass inherited from generic class HOT 1
- Enum fields always cast as JSON instead of native type
- Issues with typeguard package v3 HOT 3
- Error when using marshmallow_dataclass with attr.s HOT 1
- Arch Linux package? HOT 4
- Ability to configure custom Nested field class
- 8.5.13 broken on py3.9? HOT 3
- mypy: error: "Type[X]" has no attribute "Schema" [attr-defined] HOT 1
- Validating enum type HOT 1
- Union field is broken: The order of Union arguments is indeterminate
- Union with generic types is broken HOT 3
- Type stub-only objects not allowed in dataclass fields HOT 7
- The type constraint of `errors` is broken HOT 3
- "dump" ignores validation HOT 2
- list[enum] ignores "by_value": True flag
- Refactor 'NewType' as it no longer conforms to the typing spec HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from marshmallow_dataclass.