8000 Fix is_set for optional proto3 fields · arpitjain799/python-betterproto@3ca092a · GitHub
[go: up one dir, main page]

Skip to content

Commit 3ca092a

Browse files
authored
Fix is_set for optional proto3 fields
1 parent 6f7d706 commit 3ca092a

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

src/betterproto/__init__.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1319,7 +1319,12 @@ def is_set(self, name: str) -> bool:
13191319
:class:`bool`
13201320
`True` if field has been set, otherwise `False`.
13211321
"""
1322-
return self.__raw_get(name) is not PLACEHOLDER
1322+
default = (
1323+
PLACEHOLDER
1324+
if not self._betterproto.meta_by_field_name[name].optional
1325+
else None
1326+
)
1327+
return self.__raw_get(name) is not default
13231328

13241329

13251330
def serialized_on_wire(message: Message) -> bool:

tests/test_features.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,3 +517,15 @@ class Spam(betterproto.Message):
517517
assert spam == deepcopied
518518
assert spam is not deepcopied
519519
assert spam.baz is not deepcopied.baz
520+
521+
522+
def test_is_set():
523+
@dataclass
524+
class Spam(betterproto.Message):
525+
foo: bool = betterproto.bool_field(1)
526+
bar: Optional[int] = betterproto.int32_field(2, optional=True)
527+
528+
assert not Spam().is_set("foo")
529+
assert not Spam().is_set("bar")
530+
assert Spam(foo=True).is_set("foo")
531+
assert Spam(foo=True, bar=0).is_set("bar")

0 commit comments

Comments
 (0)
0