From f40aa8cb5860adaa740909409bc244ccb3a6c37e Mon Sep 17 00:00:00 2001 From: David Peter Date: Fri, 4 Jul 2025 10:17:39 +0200 Subject: [PATCH] [ty] `dataclasses.field` support --- .../resources/mdtest/dataclasses/fields.md | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 crates/ty_python_semantic/resources/mdtest/dataclasses/fields.md diff --git a/crates/ty_python_semantic/resources/mdtest/dataclasses/fields.md b/crates/ty_python_semantic/resources/mdtest/dataclasses/fields.md new file mode 100644 index 0000000000..cafed930ec --- /dev/null +++ b/crates/ty_python_semantic/resources/mdtest/dataclasses/fields.md @@ -0,0 +1,35 @@ +# Dataclass fields + +## Basic + +```py +from dataclasses import dataclass, field + +@dataclass +class Member: + name: str + role: str = field(default="user") + tag: str | None = field(default=None, init=False) + +# TODO: this should not include the `tag` parameter, since it has `init=False` set +# revealed: (self: Member, name: str, role: str = Unknown, tag: str | None = Unknown) -> None +reveal_type(Member.__init__) + +alice = Member(name="Alice", role="admin") +reveal_type(alice.role) # revealed: str +alice.role = "moderator" + +# TODO: this should be an error, `tag` has `init=False` +bob = Member(name="Bob", tag="VIP") +``` + +## The `field` function + +```py +from dataclasses import field + +# TODO: this should be `Literal[1]`. This is currently blocked on enum support, because +# the `dataclasses.field` overloads make use of a `_MISSING_TYPE` enum, for which we +# infer a @Todo type, and therefore pick the wrong overload. +reveal_type(field(default=1)) # revealed: Unknown +```