3 ms·
Do you mean Python's lack of a labeled union type?
by fritzo 3y ago
Do you mean Python's lack of a labeled union type?
- Spivak 3y agoPydantic does though. class A(BaseModel): status: Literal["success"] class B(BaseModel): status: Literal["error"] class C(BaseModel, ABC): __root__: Union[A, B] = Field(discriminator="status") aorb = C.parse_obj(blah…).__root__ if aorb.status == "error": # aorb will type check as B.
- b33j0r 3y agoYou are a friend and a scholar. I was looking for a solution in pydantic that is wildly relevant. Thanks, I didn’t realize that was implemented/existed. My only objection is using ABC in your MRO. Haha, just a little bit overloaded with abstract base classes and using A, B, and C. I got it eventually! Cool.
- Spivak 3y agoYa know what, on reading that that does seem confusing. My brain had long since internalized ABC as a single token I didn't even notice.
- LoganDark 3y agoI believe this is a good example of type narrowing :)
- LoganDark 3y agoYeah. Been spoiled by Rust.
- contravariant 3y agoIt doesn't seem that far off though, it does have a union type and with pattern matching you can achieve pretty much the same thing (sure you may need a few extra classes if the types aren't distinct already but that seems like a small difference). I don't know if type checkers can figure out if a pattern match statement is exhaustive yet though, that would be interesting.