From 162fcd8166f83091060ad683d732e5e63c303ed6 Mon Sep 17 00:00:00 2001 From: Adrien Vannson Date: Mon, 9 Sep 2024 14:41:35 +0200 Subject: [PATCH 1/4] Fix placeholder deep copy --- src/betterproto/__init__.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/betterproto/__init__.py b/src/betterproto/__init__.py index cbafc838d..0025d93e0 100644 --- a/src/betterproto/__init__.py +++ b/src/betterproto/__init__.py @@ -169,7 +169,17 @@ class Casing(builtin_enum.Enum): SNAKE = snake_case #: A snake_case sterilization function. -PLACEHOLDER: Any = object() +class Placeholder: + def __copy__(self): + return self + + def __deepcopy__(self, _): + return self + + +# We can't simply use object() here because pydantic automatically performs deep-copy of mutable default values +# See https://github.com/danielgtaylor/python-betterproto/issues/606 +PLACEHOLDER: Any = Placeholder() @dataclasses.dataclass(frozen=True) From 90fa2ed881a080e0ada0fa65de80bced0f2df955 Mon Sep 17 00:00:00 2001 From: Adrien Date: Tue, 10 Sep 2024 11:18:28 +0200 Subject: [PATCH 2/4] Add annotations, __repr__ and __slots__ Co-authored-by: James Hilton-Balfe --- src/betterproto/__init__.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/betterproto/__init__.py b/src/betterproto/__init__.py index 0025d93e0..d42ee68f2 100644 --- a/src/betterproto/__init__.py +++ b/src/betterproto/__init__.py @@ -170,15 +170,20 @@ class Casing(builtin_enum.Enum): class Placeholder: - def __copy__(self): + __slots__ = () + + def __repr__(self) -> str: + return "" + + def __copy__(self) -> Self: return self - def __deepcopy__(self, _): + def __deepcopy__(self, _) -> Self: return self # We can't simply use object() here because pydantic automatically performs deep-copy of mutable default values -# See https://github.com/danielgtaylor/python-betterproto/issues/606 +# See #606 PLACEHOLDER: Any = Placeholder() From 380877e00f00a0528346c4a28f171fbc5860d88d Mon Sep 17 00:00:00 2001 From: Adrien Date: Tue, 10 Sep 2024 12:13:28 +0200 Subject: [PATCH 3/4] Fix annotation --- src/betterproto/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/betterproto/__init__.py b/src/betterproto/__init__.py index d42ee68f2..486a44e40 100644 --- a/src/betterproto/__init__.py +++ b/src/betterproto/__init__.py @@ -184,7 +184,7 @@ def __deepcopy__(self, _) -> Self: # We can't simply use object() here because pydantic automatically performs deep-copy of mutable default values # See #606 -PLACEHOLDER: Any = Placeholder() +PLACEHOLDER: Placeholder = Placeholder() @dataclasses.dataclass(frozen=True) From 465f0230c40b382b5dd7f7098181246dc496b8ae Mon Sep 17 00:00:00 2001 From: Adrien Vannson Date: Wed, 18 Sep 2024 10:53:46 +0200 Subject: [PATCH 4/4] Fix typing --- src/betterproto/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/betterproto/__init__.py b/src/betterproto/__init__.py index 486a44e40..4bc827f5e 100644 --- a/src/betterproto/__init__.py +++ b/src/betterproto/__init__.py @@ -184,7 +184,7 @@ def __deepcopy__(self, _) -> Self: # We can't simply use object() here because pydantic automatically performs deep-copy of mutable default values # See #606 -PLACEHOLDER: Placeholder = Placeholder() +PLACEHOLDER: Any = Placeholder() @dataclasses.dataclass(frozen=True) @@ -221,7 +221,7 @@ def dataclass_field( ) -> dataclasses.Field: """Creates a dataclass field with attached protobuf metadata.""" return dataclasses.field( - default=None if optional else PLACEHOLDER, + default=None if optional else PLACEHOLDER, # type: ignore metadata={ "betterproto": FieldMetadata( number, proto_type, map_types, group, wraps, optional