Giter Site home page Giter Site logo

default behavior doesn't work for non JSON serializable types (because default is used for both marshmallow's missing and default fields) about marshmallow_dataclass HOT 4 CLOSED

lovasoa avatar lovasoa commented on May 22, 2024
default behavior doesn't work for non JSON serializable types (because default is used for both marshmallow's missing and default fields)

from marshmallow_dataclass.

Comments (4)

evanfwelch avatar evanfwelch commented on May 22, 2024

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.

evanfwelch avatar evanfwelch commented on May 22, 2024

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.

lovasoa avatar lovasoa commented on May 22, 2024

@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.

evanfwelch avatar evanfwelch commented on May 22, 2024

@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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.