Implementing pickle methods (#535)

Continuing work from #484 by @kevinaud to fix #419

* Implementing pickle methods
* Implement __copy__, __reduce__, and fix __setstate__
* Moved pickling tests into their own file
* Add test for caching
This commit is contained in:
Vasilios
2023-10-16 22:17:15 +11:00
committed by GitHub
parent 4f18ed1325
commit ca6b9fe1a2
5 changed files with 605 additions and 376 deletions

View File

@@ -874,6 +874,14 @@ class Message(ABC):
kwargs[name] = deepcopy(value)
return self.__class__(**kwargs) # type: ignore
def __copy__(self: T, _: Any = {}) -> T:
kwargs = {}
for name in self._betterproto.sorted_field_names:
value = self.__raw_get(name)
if value is not PLACEHOLDER:
kwargs[name] = value
return self.__class__(**kwargs) # type: ignore
@property
def _betterproto(self) -> ProtoClassMetadata:
"""
@@ -1113,6 +1121,15 @@ class Message(ABC):
"""
return bytes(self)
def __getstate__(self) -> bytes:
return bytes(self)
def __setstate__(self: T, pickled_bytes: bytes) -> T:
return self.parse(pickled_bytes)
def __reduce__(self) -> Tuple[Any, ...]:
return (self.__class__.FromString, (bytes(self),))
@classmethod
def _type_hint(cls, field_name: str) -> Type:
return cls._type_hints()[field_name]