Description
According to the Readme it should be possible to access fields of a oneof-group by pattern matching so that static analysis tools can provide type hints:
test = Test()
match test:
case Test(on=value):
print(value) # value: bool
case Test(count=value):
print(value) # value: int
case Test(name=value):
print(value) # value: str
case _:
print("No value provided")
However, the tool pyright
(used by the pylance
extension for vscode) does not provide type hints for the second and third case. I first thought this was a bug in pyright, but according to a pyright maintainer this is actually intentional. Apparently, from the point of view of a type checker, the second and third case blocks are unreachable (this pattern even triggers a warning from pyright when configured accordingly).
Possible solution
Let's assume we change the compiler to generate the following class:
@dataclass(eq=False, repr=False)
class Test(betterproto.Message):
on: Optional[bool] = betterproto.bool_field(1, group="foo")
count: Optional[int] = betterproto.int32_field(2, group="foo")
name: Optional[str] = betterproto.string_field(3, group="foo")
Then the following match statement is properly supported by pyright:
test = Test()
match test:
case Test(on=bool(value)):
print(value) # value: bool
case Test(count=int(value)):
print(value) # value: int
case Test(name=str(value)):
print(value) # value: str
case _:
print("No value provided")
I think one could argue that it is actually correct to mark these fields optional. What do you think?
System Information
- python 3.11.9
- betterproto 2.0.0b7
- pylance v2024.8.1