Giter Site home page Giter Site logo

Comments (3)

LostInDarkMath avatar LostInDarkMath commented on June 12, 2024 1

Okay, thanks to the warning of your package I found a nice solution for this :)

The warning I got

UserWarning: ****** WARNING ****** marshmallow_dataclass was called on the class <class '__main__.MyString'>, which is not a dataclass. It is going to try and convert the class into a dataclass, which may have undesirable side effects. To avoid this message, make sure all your classes and all the classes of their fields are either explicitly supported by marshmallow_dataclass, or define the schema explicitly using field(metadata=dict(marshmallow_field=...)). For more information, see https://github.com/lovasoa/marshmallow_dataclass/issues/51 ****** WARNING ******

Complete working example

from dataclasses import dataclass, field
from typing import TypeVar, Generic

import marshmallow_dataclass
from marshmallow.fields import String

T = TypeVar('T')


class MyString(str):
    def revert(self) -> 'MyString':
        return MyString(self[::-1])


class MyField(String, Generic[T]):
    def _deserialize(self, value, attr, data, **kwargs) -> T:
        type_ = self.__orig_class__.__args__[0]

        if not isinstance(value, type_):
            value = type_(value)

        return value


@dataclass
class Foo:
    value: MyString = field(metadata=dict(marshmallow_field=MyField[MyString]()))


if __name__ == '__main__':
    foo = Foo(value=MyString('hello world'))
    print(MyString('hello'))
    schema_body = marshmallow_dataclass.class_schema(clazz=Foo)

    MyString('hello')

Maybe this will help someone who encounter the same problem :)

from marshmallow_dataclass.

dairiki avatar dairiki commented on June 12, 2024 1

As you figured out, the root of the problem is that class_schema does not, by default, know anything about (e.g. how to serialize/deserialize) your MyString class. When class_schema encounters an unknown class type, as a last-ditch effort to convert it to something it can handle (for reasons I'm not completely sure of) it tries to convert it to a dataclass.

Note that if you have a lot of MyString (or other types unknown to class_schema) fields in your dataclass(es), an alternative to specifying the marshmallow field type in a field() on each of them is to use a custom base schema class with a custom TYPE_MAPPING to define a mapping between your types and marshmallow Field types.

from marshmallow_dataclass.

LostInDarkMath avatar LostInDarkMath commented on June 12, 2024 1

Thank you very much @dairiki! That makes the code base indeed more clean.

Here is the complete working example for this approach:

from dataclasses import dataclass
from typing import TypeVar, Generic

import marshmallow
import marshmallow_dataclass
from marshmallow.fields import String

T = TypeVar('T')


class MyString(str):
    def revert(self) -> 'MyString':
        return MyString(self[::-1])


class MyField(String, Generic[T]):
    def _deserialize(self, value, attr, data, **kwargs) -> T:
        type_ = self.__orig_class__.__args__[0]

        if not isinstance(value, type_):
            value = type_(value)

        return value


class MyBaseSchema(marshmallow.Schema):
    TYPE_MAPPING = {MyString: MyField[MyString]}


@dataclass
class Foo:
    value: MyString


if __name__ == '__main__':
    foo = Foo(value=MyString('hello world'))
    print(MyString('hello'))
    schema_body = marshmallow_dataclass.class_schema(clazz=Foo, base_schema=MyBaseSchema)

    MyString('hello')

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.