Release Notes
Released on 2026-04-13.
As of v0.0.30, ty no longer unions Unknown into most inferred types of unannotated attributes. For example:
class Foo:
def __init__(self) -> None:
self.value = 1
reveal_type(Foo().value) # revealed: int
Foo().value = "x" # error: [invalid-assignment]In previous versions, reveal_type(Foo().value) would have included Unknown, so the assignment to "x" would not have been flagged. Since this can affect inferred attribute types throughout a codebase, upgrading may lead to both new and resolved diagnostics. Initializers of None and other non-literal singleton types remain exceptions. See #24531 for details.
Bug fixes
- Disallow bare
ParamSpecinConcatenateprefixes (#24474) - Ensure '/' parameter appears before '*' when rendering
Callabletypes (#24497) - Ensure nested conditional blocks inherit
TYPE_CHECKINGstate from outer blocks (#24470) - Fix bad diagnostic range for incorrect implicit
__init_subclass__calls (#24541) - Fix incorrect assignability of
type[T]to a metaclass (#24515) - Fix stack overflows from recursive types (#24413)
- Server: fix signature help for
ParamSpec-specialized class calls (#24399) - Use
TypedDictfield types as type context to inform the inference of arguments passed toTypedDictconstructors (#24422)
LSP server
- Adjust semantic tokens implementation to ensure that type alias values have "type form" syntax highlighting in IDEs (#24478)
- Completions: rank symbols from
typingandcollectionshigher than third party re-exports (#23643) - Ignore unsupported editor-selected Python versions (#24498)
- Improve
TypedDictconstructor support in the LSP by synthesizing__init__(#24476, #24522, #24535) - Return all attribute definitions for goto definition, rather than just the last definition in the given scope (#24332)
- Show
infosubdiagnostics in LSP diagnostic messages (#24328) - Use the context of the kind of object a parameter is expected to receive to inform syntax highlighting of arguments passed to call expressions (#23949)
Diagnostics
- Hide "Rule xyz is enabled"-style hints unless verbose mode was specified (#24469)
- Improve consistency of pedantic lints complaining about badly named types (#24575)
- Point to the first reachable declaration, rather than the first declaration, in declaration-based diagnostics (#24564)
Core type checking
- Add support for functional
Enum(...)syntax (#23602, #24570, #24571) - Allow
Finalvariable assignments in__post_init__(#24529) - Allow partially stringified
type[...]annotations, e.g.type["MyClass"](#24518) - Emit a diagnostic when attempting to inherit from a class with
__init_subclass__ = None(#24543) - Fix
TypeGuardandTypeIsnarrowing for unbound method calls (#24612) - Fix assignability of intersections with bounded TypeVars (#24502)
- Fix excess subscript argument inference for non-generic types so that
list[int][0]leads to 1 diagnostic, rather than 2 (#24354) - Inherit
dataclass_transformmetadata from metaclass bases (#24615) - Lazily evaluate declaration reachability in field and enum filters (#24451)
- Normalize explicit
Noneaccessors in manual property construction (#24492) - Reject deleting
Finalattributes (#24508) - Respect non-required keys in
TypedDictunpacking (#24446) - Respect property deleters in attribute deletion checks (#24500)
- Stop special-casing
strconstructor (#24514) - Stop unioning
Unknowninto types of un-annotated attributes (#24531) - Support
super()in metaclass methods (#24483) - Tighten up a few edge cases in
Concatenatetype-expression parsing (#24172) - Use basic blocks for determining if a node is in an
if TYPE_CHECKINGblock (#24394)
Contributors
- @charliermarsh
- @Glyphack
- @MichaReiser
- @sharkdp
- @carljm
- @YilunAllenChen
- @zanieb
- @AlexWaygood
- @thejchap
Install ty 0.0.30
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ty/releases/download/0.0.30/ty-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ty/releases/download/0.0.30/ty-installer.ps1 | iex"Download ty 0.0.30
Verifying GitHub Artifact Attestations
The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:
gh attestation verify <file-path of downloaded artifact> --repo astral-sh/tyYou can also download the attestation from GitHub and verify against that directly:
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>