Files
astral-ty/CHANGELOG.md
T
2026-05-01 18:19:06 -04:00

238 KiB

Changelog

0.0.34

Released on 2026-05-01.

Bug fixes

  • Avoid panic in recursive protocol signature comparisons (#24665)
  • Avoid panics for syntax error targets in invalid unpacking assignments (#24663)
  • Fix unbounded type growth in nested-typevar substitutions (#24803)
  • Prevent string annotation tokens from leaking across notebook cells (#24919)
  • Support reference finding in stringified annotations (#24956)

LSP server

  • Add hover support for PEP 695 type aliases (#24926)
  • Offer string literal completion suggestions based on expected type (#24555)
  • Support Go-to Definition, Go-To Declaration, and Find References for TypedDict and NamedTuple initializers (#24897)
  • Support Annotated metadata in semantic tokens (#24890)

Core type checking

  • Add support for functools.partial (#24582)
  • Fix ParamSpec defaults and alias variance (#24479)
  • Fix TypeIs assignability with gradual types (#24928)
  • Infer dict(**TypedDict) in TypedDict context (#24709)
  • Support infer_variance for legacy TypeVar (#24930)
  • Support variance keywords in ParamSpec (#24927)
  • Sync vendored typeshed stubs (#24952). Typeshed diff
  • Unpack Union of TypedDict in various sites (#24958)

Diagnostics

  • Add missing error context node for protocol to protocol assignability (#24905)
  • Show a diagnostic for unsupported inferred Python version (#24581)

Performance

  • Lazily build TypeVar accumulations (#24782)

Contributors

0.0.33

Released on 2026-04-28.

Notable changes

  • ty now prefers the declared type of an annotated assignment in more situations (#24802). Consider this example:

    from some_library import untyped_function
    
    threshold: int | None = 0
    result: str = untyped_function()
    

    ty previously favored the inferred type of the right hand side expression when threshold and result were used. This is useful for threshold, as it allows something like threshold += 1 to work without an error: we know that threshold could later become None, but right now, we see that it is an int. However, for result, the inferred type is Unknown. This is not a useful type and it can lead to false negatives. Starting with this release, ty will therefore prefer the declared type if the inferred and declared types are mutually assignable. In the above example, threshold will still be inferred as int (or rather Literal[1]), but result will now be inferred as str. If you previously added casts to work around this behavior, you should be able to remove them after upgrading.

Bug fixes

  • Fix reporting of annotation-only locals as unused (#24811)
  • Fix project and workspace selection (#24824)
  • Fix go-to definition for generic classes (#24714)
  • Fix receiver coloring for aliased decorators (#24884)

LSP server

  • Add support for go-to definition in literal enum member inlay hints (#24792)
  • Add support for "baking" keyword argument inlay hints into the source code (#24667)
  • Don't allow inlay hint edits when introducing a non global scope symbol (#24797)
  • Omit semantic highlighting for unresolved symbols (#24718)

Core type checking

  • Support narrowing with aliased conditional expressions (#24302)
  • Model short-circuiting control flow in Boolean expressions (#24458)
  • Handle finally blocks where all try/except blocks are terminal (#24882)
  • Detect invalid ClassVar vs instance-attribute overrides (#24767)
  • Emit diagnostic for invalid uses of Unpack[...] (#24868)
  • Infer lambda parameter types with Callable type context (#24317)
  • Support ** unpacking of TypedDict in dict-literal assignments (#24703)
  • Support Unpack[TypedDict] in **kwargs signatures (#24653)
  • Treat [*xs] as an irrefutable pattern when matching on Sequence (#24787)
  • Improve generics solving for unions in invariant positions (#24698)
  • Improve generics solving for unions when matching against protocols (#24837)

Diagnostics

  • Add error context to invalid-return-type diagnostics, invalid-yield diagnostics, attribute assignment diagnostics (#24770, #24771)
  • Add error context for invalid TypedDict assignments (#24790)
  • Add error context for invalid intersection type assignments (#24772)
  • Improve TypedDict to dict assignment error diagnostics (#24768)
  • Add contextual secondary annotations in more places (#24696)
  • Include full type in invalid-key diagnostics for unions of TypedDicts (#24693)
  • Emit more specific diagnostics for "possibly unbound" errors from context manager dunder methods invoked on a union. (#24662)
  • Remove duplicate invalid-type-form diagnostics for PEP-613 type alias values (#24760)
  • Improve diagnostics for implicit calls to a possibly unbound unary operator (#24816)
  • Improve diagnostics for possibly-unbound errors from implicit dunder calls on unions (#24676)

Performance

  • Optimize signature checking based on number of arguments (#24674)
  • Defer union of parameter types (#24756)
  • Skip checks for gradual vararg calls (#24748)

Other changes

  • Fix notifications about watched changes for entities outside any workspace (#24775)

Contributors

0.0.32

Released on 2026-04-20.

Bug fixes

  • Fix panic when __get__ uses Concatenate self-type and wraps a __call__ (#24692)
  • Avoid panicking on overloaded Callable type context (#24661)
  • Expand class bases in per-base lint checks (#24695, #24699)
  • Fix stack overflow for binary operator inference involving recursive types (#24551)

LSP server

  • Dim out unreachable code in IDEs (#24580)
  • Do not suggest argument completion when typing the value of a keyword argument (#24669)
  • Retrieve the docstring from the overload implementation if an @overload-decorated function has no docstring (#23920)

Core type checking

  • Allow if statements in TypedDict bodies (#24702)
  • Disallow @disjoint_base on TypedDicts and Protocols (#24671)
  • Do not consider a subclass of a @dataclass_transform-decorated class to have dataclass-like semantics if it has type in its MRO (#24679)
  • Reject using properties with Never setters or deleters (#24510)
  • Sync vendored typeshed stubs (#24646). Typeshed diff

Diagnostics

  • Show error context for assignability diagnostics (#24309)
  • Use partially qualified names when reporting diagnostics regarding bad calls to methods (#24560)
  • Reduce source code context window to zero (#24689)
  • Merge same-file annotations if there is only a single line separating them (#24694)

Performance

  • Memoize binary operator return types (#24700)
  • Gate protocol compatibility on member count (#24684)

Contributors

0.0.31

Released on 2026-04-15.

Bug fixes

  • Avoid panic from double inference for namedtuple(typename=T, field_names=x, **{}) (#24641)
  • Avoid panic from double inference with missing functional Enum(...) names (#24638)
  • Avoid panic from double inference with functional Enum(value=...) (#24639)
  • Fix cases where invalid-key fix doesn't converge, and override-of-final-method produces invalid syntax (#24649)
  • Fix unnecessary ty:ignore comments inserted by --add-ignore for diagnostics starting on the same line (#24651)

CLI

  • Add --fix mode to enable auto-fix for diagnostics (#24097)

Performance

  • Avoid excessive memory usage for dataclasses with many fields (#24620)

Core type checking

  • Check inherited NamedTuple field conflicts (#24542)
  • Error when duplicate keywords are provided to TypedDict constructors (#24449)
  • Respect mixed positional and keyword arguments in TypedDict constructor (#24448)
  • Respect subclass shadowing for inherited NamedTuple fields (#24640)
  • Skip EnumMeta.__call__ for enum constructor signatures (#24513)

Contributors

0.0.30

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 ParamSpec in Concatenate prefixes (#24474)
  • Ensure '/' parameter appears before '*' when rendering Callable types (#24497)
  • Ensure nested conditional blocks inherit TYPE_CHECKING state 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 TypedDict field types as type context to inform the inference of arguments passed to TypedDict constructors (#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 typing and collections higher than third party re-exports (#23643)
  • Ignore unsupported editor-selected Python versions (#24498)
  • Improve TypedDict constructor 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 info subdiagnostics 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 Final variable 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 TypeGuard and TypeIs narrowing 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_transform metadata from metaclass bases (#24615)
  • Lazily evaluate declaration reachability in field and enum filters (#24451)
  • Normalize explicit None accessors in manual property construction (#24492)
  • Reject deleting Final attributes (#24508)
  • Respect non-required keys in TypedDict unpacking (#24446)
  • Respect property deleters in attribute deletion checks (#24500)
  • Stop special-casing str constructor (#24514)
  • Stop unioning Unknown into types of un-annotated attributes (#24531)
  • Support super() in metaclass methods (#24483)
  • Tighten up a few edge cases in Concatenate type-expression parsing (#24172)
  • Use basic blocks for determining if a node is in an if TYPE_CHECKING block (#24394)

Contributors

0.0.29

Released on 2026-04-05.

Bug fixes

  • Avoid special-casing for dataclasses.field if it's not in field_specifiers (#24397)
  • Reject unsupported environment.python-version values in configuration files (#24402)
  • Respect supported lower bounds from requires-python (#24401)

Core type checking

  • Add support for types.new_class (#23144)
  • Fix PEP 695 type aliases in with statement (#24395)
  • Respect __new__ and metaclass __call__ return types (#24357)
  • Treat enum attributes with type annotations as members (#23776)

Contributors

0.0.28

Released on 2026-04-02.

Bug fixes

  • Mark loop header assignments as used to avoid false positives in "unused variable" diagnostics (#24336)

LSP server

  • Show constructor signature of classes when hovering over them (#24257)

Core type checking

  • Avoid emitting cascading diagnostics when parsing invalid type expressions (#24326)
  • Handle most "deep" mutual TypeVar constraints (#24079)
  • Improve consistency and quality of diagnostics relating to invalid type forms (#24325)
  • Improve robustness of various type-qualifier-related checks (#24251)
  • Infer the extra_items keyword argument to class-based TypedDicts as an annotation expression (#24362)
  • Use bidirectional inference to fix false positives on operations such as x: list[int | None] = [None] * 2 (#24197)
  • Sync vendored typeshed stubs (#24340). Typeshed diff
  • Tighten up validation of subscripts and attributes in type expressions (#24329)
  • Use infer_type_expression for parsing parameter annotations and return-type annotations (#24353)
  • Use infer_type_expression for validating PEP-613 type aliases (#24370)
  • Validate TypedDict fields when subclassing (#24338)
  • Validate type qualifiers in functional TypedDict fields and the extra_items keyword to functional TypedDicts (#24360)
  • Improve diagnostics for invalid functional TypedDicts (#24345)

Contributors

0.0.27

Released on 2026-03-31.

Bug fixes

  • Fix panic on debug builds when attempting to provide autocomplete suggestions for list[int]<CURSOR>() (#24167)
  • Fix instance-attribute lookup in methods of protocol classes (#24213)
  • Fix nested global and nonlocal lookups through forwarding scopes (#24279)
  • Fix panic on list[Annotated[()]] (#24303)
  • Fix stack overflow on type A = TypeIs[Callable[[], A]] (#24245)
  • Use _cls as the name of the first argument for synthesized collections.namedtuple constructor methods (#24333)

LSP server

  • Fix semantic token classification for properties accessed on instances (#24065)
  • Grey out unused bindings in the editor (#23305)

Core type checking

  • Add bidirectional type context for TypedDict get() defaults (#24231)
  • Add bidirectional type context for TypedDict pop() defaults (#24229)
  • Add support for functional TypedDict (#24174, #24331, #24295)
  • Ban type qualifiers in PEP-695 type aliases (#24242)
  • Enforce Final attribute assignment rules for annotated and augmented writes (#23880)
  • Improve support for Callable type context (#23888)
  • Infer lambda expressions with Callable type context (#22633)
  • Don't incorrectly infer the type of a method as being a singleton type when it's accessed off an instance (#24039)
  • Propagate type context through await expressions (#24256)
  • Resolve union-likes in emitting union attribute errors (#24263)
  • Show the user where the variable was declared as Final when emitting a diagnostic about a Final variable being reassigned (#24194)

Contributors

0.0.26

Released on 2026-03-26.

Bug fixes

  • Prevent "too many cycle iteration" panics in more situations (#24061)
  • Fix false positives and false negatives when unpacking a union of tuples into a function call (#23298)

Core type checking

  • Add support for typing.Concatenate (#23689)
  • Validate the return type of generator functions (#24026)
  • Support dataclass field converters (#23088)
  • Disallow Self in metaclass and static methods (#23231)
  • Improve call inference for keyword-only dict() (#24103)
  • Respect non-explicitly defined dataclass_transform params (#24170)
  • Unconditionally silence diagnostics in unreachable code (#24179)
  • Respect terminal-function-call narrowing in global scope (#23245)

Performance

  • Fix performance regression for narrowing on a larger Literal type(#24185)

Contributors

0.0.25

Released on 2026-03-24.

Breaking changes

  • Support type:ignore[ty:code] suppressions (#24096)

Bug fixes

  • Avoid eager TypedDict diagnostics in TypedDict | dict unions (#24151)
  • Fix Salsa panic propagation (#24141)
  • Fix folding ranges of comments separated by statements (#24132)
  • Fix loop-header reachability cycles in conditional unpacking (#24006)
  • Fix subtyping of intersections containing NewTypes of unions vs. unions (#24087)
  • Fix untracked reads in Salsa queries that can lead to backdating panics (#24051)
  • Prevent tainted loop bindings in cycle normalization (#24143)
  • Simplify an intersection of N & ~T to Never if B & ~T would simplify to Never, where B is the concrete base type of a NewType N (#24086)

LSP

  • Preserve blank lines between comments and imports in add-import action (#24066)

Type checking

  • Add diagnostic hint for invalid assignments involving invariant generics (#24032)
  • Add precisely-typed overloads for TypedDict update (#24101)
  • Disallow read-only fields in TypedDict updates (#24128)
  • Expand bounded typevars to their upper bounds when evaluating truthiness comparisons between intersections and literal types (#24082)
  • Emit reveal_type diagnostics in unreachable code (#24070)
  • Improve isinstance() reachability analysis (#24077)
  • Improve keyword argument narrowing for nested dictionaries (#24010)
  • Infer yield expression types (#23796)
  • Reduce diagnostic range for invalid-metaclass (#24145)
  • Support narrowing for extended walrus targets (#24129)
  • Unions/intersections of gradual types should be assignable to Never (#24056)

Contributors

0.0.24

Released on 2026-03-19.

Bug fixes

  • Ensure TypedDict subscripts for unknown keys return Unknown (#23926)
  • Fix overflow with recursive TypeIs (#23784)
  • Fix variance of frozen dataclass-transform models (#23931)

LSP server

Core type checking

  • Improve performance and correctness by avoiding inferring intersection types for call arguments as a result of bidirectional inference (#23933)
  • Narrow keyword arguments when unpacking dictionary instances (#23436)
  • Discover /usr/local/lib dist-packages on Debian/Ubuntu (#23797)
  • Sync vendored typeshed stubs (#23963). Typeshed diff

Performance

  • Introduce fast path for protocol non-assignability (#23952)
  • Improved generic-solver performance in cases involving overload sets (#23881)

Contributors

0.0.23

Released on 2026-03-13.

Bug fixes

  • Fix false-positive diagnostics for PEP-604 union annotations on attribute targets on Python 3.9 when from __future__ import annotations is active (#23915)
  • dataclass_transform: Respect kw_only overwrites in dataclasses (#23930)
  • Fix too-many-cycle panics when inferring loop variables with Literal types (#23875)

Server

Core type checking

  • Split errors for possibly missing submodules into a new possibly-missing-submodule error code (enabled by default), and make possibly-missing-attribute ignored by default (#23918)
  • Improve handling of bidirectional inference when (#23844)
  • Fix inference of conditionally defined properties (#23925)

Improvements to diagnostics

  • Clarify in diagnostics that from __future__ import annotations only stringifies type annotations (#23928)

Performance improvements

  • Avoid duplicated work during multi-inference (#23923)

Contributors

0.0.22

Released on 2026-03-12.

Bug fixes

  • Fix issue where variables could be inferred as Divergent if they were assigned using tuple unpacking in loops (#23812)
  • Allow error = "all" in a root pyproject.toml file to be overridden using tool.ty.overrides in a subdirectory's pyproject.toml file (#23712)
  • Only unsoundly upcast type[] types to their constructor Callable type during assignability checks, not during redundancy/subtyping checks (#23834, #23901)
  • Fix stack overflow that could occur with certain recursive protocols (#23870)

LSP server

  • Improve syntax highlighting by fixing semantic token classification for generic class members in annotations (#23811)

CLI

  • Add ty explain <RULE> CLI command (#23766)

Core type checking

  • Add validation for type parameters with defaults after TypeVarTuple parameters (#23807)
  • Allow subtypes of LiteralString to be narrowed using equality checks (#23794)
  • Detect invalid partially stringified PEP-604 unions (#23285)
  • Disambiguate duplicate-looking overloaded callables in union display (#23907)
  • Don't promote module-literal types to types.ModuleType (#23786)
  • Improve type context support for __setitem__ dunder calls (#23800)
  • Infer t | {"foo": int} as TD if t is an instance of a TypedDict td with a foo: int key (#23806)
  • Narrow T to T & str rather than str if T is a constrained TypeVar with str as one of its constraints (#23850)
  • Promote None to None | Unknown in invariant contexts (#23790)
  • Reject type[Callable] in type annotations (#23753)
  • Support enum member access through enum instances and members (#23772)
  • Eagerly narrow the type associated with keys of heterogeneous dict literals even when a dict literal appears as a subexpression inside a list or tuple literals (#23569)
  • Ensure that T & ~S is always inferred as a subtype of U during generic inference if T is understood as a subtype of U (#23728)
  • Optimize and improve cycle recovery by preventing "tainted" unions in cycle normalization (#23563)

Installer

  • Prefer downloading releases from Astral's mirror over GitHub (#2980)

Contributors

0.0.21

Released on 2026-03-05.

Bug fixes

  • Avoid stack overflow with recursive typevar (#23652)
  • Fix panic on incomplete except handlers (#23708)
  • Allow unions of different-length iterables in *args unpacking into optional positional parameters (#23124)
  • Don't replace Any attributes with object after isinstance narrowing (#23725)

LSP server

  • Exclude decorators from class/def code folding (#23543)
  • Fix handling of non-Python text documents (#23704)

Configuration

  • Add all selector to ty.json schema (#23721)
  • Fix precedence of all selector in TOML configurations (#23723)
  • Make all selector case-sensitive (#23713)

Type checking

  • Add invalid-enum-member-annotation lint rule (#23648)
  • Add a diagnostic for an unused awaitable (#23650)
  • Add a diagnostic if a TypeVar is used to specialize a ParamSpec, or vice versa (#23738)
  • Add more type-variable default validation (#23639)
  • Add unbound type variable detection in annotations (#23641)
  • Apply narrowing to walrus values (#23687)
  • Do not union Unknown into unannotated container types (#23718)
  • Avoid inferring generics with negative intersections (#23750)
  • More precise types for name and value of an enum (#23683)
  • Better preserve user-provided union order in inferred specializations (#23715)
  • Support narrowing in ternary expressions (#23726)
  • Validate bare ParamSpec usage in type annotations, and support stringified ParamSpecs as the first argument to Callable (#23625)

Contributors

0.0.20

Released on 2026-03-02.

Bug fixes

  • Disallow negative narrowing for isinstance() or issubclass() checks involving type[] types (#23598)
  • Fix binary operations between an instance of a NewType of float and an instance of Any/Unknown (#23620)
  • Fix bug where ty would think that a Callable with a variadic positional parameter could be a subtype of a Callable with a positional-or-keyword parameter (#23610)
  • Fix inference of t.__mro__ if t is an instance of type[Any] (#23632)
  • Fix overloaded callable assignability for unary Callable targets (#23277)
  • Limit recursion depth when displaying self-referential function types (#23647)
  • Ensure that python -m ty works even when ty was installed into an ephemeral virtual environment (#2852)

LSP server

  • Add support for the LSP protocol's "type hierarchy" feature (#23566)

Type checking

  • Add more ParamSpec validation for P.args and P.kwargs (#23640)
  • Ban nested Required/NotRequired, and ban them both outside of TypedDict fields (#23627)
  • Detect inconsistent generic base class specializations that appear in the same MRO (#23615)
  • Detect invalid uses of @final on non-methods (#23604)
  • Add partial support and validation for Unpack when used with tuple types (#23651)
  • Recurse into tuples and nested tuples when applying special-cased validation of arguments passed to isinstance() and issubclass() (#23607)
  • Reject ellipsis literals in odd places in type/annotation expressions (#23611)
  • Reject functions with PEP-695 type parameters that shadow type parameters from enclosing scopes (#23619)
  • Reject generic metaclasses parameterized by type variables (#23628)
  • Treat dataclass_transform dataclasses as neither frozen nor non-frozen (#23366)
  • Validate that type variable defaults don't reference later type parameters or type parameters out of scope (#23623)

Typeshed

Contributors

0.0.19

Released on 2026-02-26.

Bug fixes

  • Fix panic in diagnostic rendering when attempting to render a code frame pointing to leading whitespace (#23458)
  • Fix panics and incorrect inference stemming from incorrectly considering overloads in another file as being associated with a function in the file being checked (#21977)
  • Fix panic when attempting to narrow the type of a dictionary key that was assigned using a multi-target assignment, e.g. x = y = {"a": 1} (#23523)
  • Fix infinite hang on mutually recursive TypeAliasType definitions (#23397)

LSP server

  • Fix inlay hints for starred unpacking targets (#23454)

Core type checking

  • Fix assignability, subtyping and equivalence checks relating to typing.Generator prior to Python 3.13 (#23386)
  • Understand that a scope's control flow terminates after await foo() if foo returns typing.Awaitable[typing.Never] or similar (#23479)
  • Implement stricter handling of calls to instances of type[T] types (#23472)
  • Support basic type narrowing for case {...}: patterns in match statements (#23462)
  • Fix bugs that could manifest in incorrect overload evaluation, false-positive complaints regarding assert_type calls or false-positive redundant-cast diagnostics by reimplementing the equivalence type relation as mutual subtyping of top and bottom materializations (#23428)
  • Fix equality and __contains__ narrowing with PEP-695 type aliases (#23545)
  • Support _value_ annotations on enum classes (#22228)

Improvements to diagnostics

  • Improve diagnostics when attempting to specialize non-generic types (#23516)
  • Render subdiagnostics when --output-format=github is specified (#23455)

Performance

  • Add a cached method for calculating the intersection of two types (#23547)
  • Add a cached method for calculating the union of two types (#23565)
  • Reduce the threshold above which Literal types in unions are upcasted to nominal-instance types in situations where the union type is recursively defined (#23521)
  • Control flow: isolate the calculation of "loop header reachability" in a dedicated, cached function (#23520)

Contributors

0.0.18

Released on 2026-02-20.

Bug fixes

  • Support classes dynamically created via type(...) with cyclic bases (#22792)
  • Fix incorrect types inferred when unpacking mixed tuples (#23437)
  • Fix stack overflow for self-referential TypeOf in annotations (#23407)
  • Fix several server panics that could occur when computing semantic tokens for the current file (#23403), #23398, #23401)

LSP server

  • Add code folding support (#23393)
  • Add warning message when running ty server interactively (#23416)
  • Exclude test-related symbols from non-first-party packages in auto-import completions (#23252)
  • Fix bug where diagnostics could disappear after opening an external file (#23447)
  • Remove spurious destination for Go-To Definition on variables defined in a loop (#23391)
  • Use the fully qualified name when "baking" an inlay hint into the source code if the scope already contains a variable with the same name as the unqualified name (#23265)
  • Resolve TypeVars in call_signature_details parameter types (#23149)

CLI

  • Add --output-format to ty version (#23387)

Configuration

  • Add replace-imports-with-any option (#23122)
  • Support shellexpand for configuration paths (#23274)

Type checking

  • Add a new diagnostic to detect invalid class patterns in match statements (#22939)
  • Allow Self in ClassVar type annotations (#23362)
  • Consider synthesized methods and ClassVar-qualified declarations when determining whether an abstract method has been overridden in a subclass (#23381)
  • Add a diagnostic when combining Final and ClassVar (#23365)
  • Fix return type of assert_never (#23389)
  • Fix assert_type diagnostic messages (#23342)
  • Ban PEP-613 type alias values from containing type-qualifier special forms (#23444)
  • Infer LiteralString for f"{literal_str_a} {literal_str_b}" (#23346)
  • Infer precise types for bit-shift operations on integer literals (#23301)
  • Make [abstract-method-in-final-class] diagnostics less verbose for classes with many abstract methods (#23379)
  • Improve diagnostics for abstract @final classes (#23376)
  • Only perform literal promotion for implicitly inferred literals (#23107)
  • Parenthesize callable types when they appear in the return annotation of other callable types (#23327)
  • Consider a call to a generic function returning Never to terminate control flow (#23419)
  • Support calls to intersection types (#22469)
  • Validate annotated assignments to attributes on self (#23388)
  • Treat a bytes-literal type as a subtype of Sequence[<constituent integers in the bytestring>] (#23329)
  • Allow a string-literal argument to match against an Iterable parameter in type variable inference. (#23326)
  • Support narrowing from a Callable type returning a TypeGuard type (#23280)

Performance

  • Consider all code paths as being ambiguously reachable in cases with pathologically large control-flow graphs (#23399)

Typeshed

Contributors

0.0.17

Released on 2026-02-13.

Bug fixes

  • Avoid Literal promotion for constrained TypeVars with Literal bounds (#23209)
  • Fix false positives in TypeVar shadowing checks (#23222)

Core type checking

  • Support generic protocols (#21902)
  • Perform control-flow analysis in loops (#22794)
  • Support typing.Self in attribute annotations (#23108)
  • Support type narrowing in situations with calls to NoReturn functions (#23109)
  • Support type narrowing and reachability analysis based on os.name checks (#23230)
  • Detect overrides of Final class variables in subclasses (#23180)
  • Fix bound method access on None (#23246)
  • Fix method calls on subclasses of Any (#23248)
  • Disallow type variables within PEP-695 type variable bounds and constraints (#22982)
  • Emit error for attribute access on union where some elements lack the attribute (#23042)
  • Emit error for invalid typevar defaults (#23194)
  • Improve display of ParamSpecs in some situations (#23211)

LSP server

  • Add hover and go-to-declaration support for subscript literals (#22837)
  • Assign lower completion ranking to deprecated names in auto import (#23188)
  • Improve spans of references to submodules imported in an __init__.py (#21795)
  • Include conditional symbols (like datetime.UTC) in auto-import in more cases (#23249)
  • Support auto-import for symbols in inlay hints (#22111)
  • Include overload declarations in find-references (#23215)

Performance

  • Avoid UnionBuilder overhead when creating a new union from the filtered elements of an existing union (#22352)

Other changes

  • Allow discovering dependencies in system Python environments (#22994)
  • Apply workspace settings to virtual files (#23228)
  • Add support for --output-format=junit (#22125)
  • Use a smaller diagnostic range for inconsistent-mro diagnostics (#23213)

Contributors

0.0.16

Released on 2026-02-10.

Bug fixes

  • Allow stringified argument in PEP-613 alias to Optional (#23200)
  • Fix fuzzer panic on slice expression in unclosed comprehension (#23146)
  • Fix combinatorial explosion due to fixed-length tuple expansion in overload matching (#23190)
  • Respect @no_type_check when combined with other decorators (#23177)
  • Fix diagnostic location for an incorrect sub-call to a specialized ParamSpec (#23036)

LSP server

  • Assign lower completions ranking to deprecated functions and classes (#23089)
  • Change goto-def for class constructors to always go to class definition (#23071)
  • Ensure diagnostic mode is consistent across projects inside the LSP server (#23121)
  • Don't include the class Foo in autocomplete suggestions when the user is typing out Foo's bases (#23141)
  • Fix parameter references across files via keyword args (#23012)
  • Fix wrong inlay hints for overloaded function arguments (#23179)
  • Support diagnostics in newly created files inside neovim (#23095)
  • Exclude already-included classes when providing completion suggestions for class bases (#23085)

CLI

  • Add support for TY_OUTPUT_FORMAT environment variable (#23123)
  • Fall back to python3 found in $PATH if no environment is found (#22843)

Type checking

  • Add inconsistent-mro autofix to move Generic[] to the end of the bases list (#22998)
  • Add precise return-type inference for struct.unpack (#22562, #23130)
  • Disallow TypeVars within ClassVars (#23184)
  • Emit diagnostic on unbound call to abstract @classmethod or @staticmethod (#23182)
  • Fix false-positive diagnostics when providing the total= keyword to TypedDict classes that had PEP-695 type parameters (#23114)
  • Narrow both left- and right-hand operands where possible (#23084)
  • Narrow chained operators (#23093)
  • Narrow equality subscripts on either operand (#23104)
  • Recognize __dataclass_transform__ to support SQLModel (#23070)
  • Relax the attribute narrowing condition to support deeper-nested attribute type narrowing (#22440)
  • Support constrained TypeVar compatibility across function boundaries (#23103)
  • Support comparison methods (__gt__, etc.) where a parameter is annotated with a Literal type (#23100)
  • Support partially specialized type context (#22748)
  • Use type context when inferring constructor argument types (#23139)
  • Validate TypedDict constructor calls for generic aliases and type[...] targets (#23113)

Performance

  • Conservative narrowing places optimization (#22734)

Contributors

0.0.15

Released on 2026-02-04.

Bug fixes

  • Add support for resolving imports of packages installed into Debian/Ubuntu dist-packages directories (#22466)
  • Avoid not-iterable false positives when iterating over an instance of an intersection type with only negated elements (#22089)
  • Fix support for stringized annotations in very large files (#22913)
  • Don't emit Liskov diagnostics for methods with mangled names (#23062)
  • Enforce that a Final symbol cannot be reassigned even after a conditional binding (#22986)
  • Fix TypedDict construction from existing TypedDict values (#22904)
  • Fix Self resolution for classes nested within methods (#22964)
  • Fix bidirectional inference with PEP 695 union type aliases (#22988)
  • Fix edge-case bugs when narrowing tagged unions in match statements (#22870)
  • Fix false-positive diagnostics when iterating over an instance of an intersection that includes a TypeVar of which the upper bound is a union where the union includes a non-iterable type (#22117)
  • Fix lookup of __contains__ to respect descriptors (#23056)
  • Fix narrowing of nonlocal variables with conditional assignments (#22966)
  • Fix several bugs that could affect NewTypes of NewTypes of float (#22997)
  • Fix several type narrowing bugs involving PEP-695 type aliases (#22894)
  • Fix spurious query cycles in decorated functions with parameter defaults, for improved performance and improved determinism (#23014)
  • Fix unary and comparison operators for TypeVars with union bounds (#22925)
  • Understand functions as method descriptors even if they are decorated with a decorator annotated as returning a PEP-695 alias to a Callable type (#22902)
  • dataclass_transform: Fix visibility of field specifiers when models are nested inside methods (#23069)

LSP server

  • Fix hover showing Unknown for bare Final instance attributes (#23003)
  • Improve support for goto-type, goto-declaration, hover, and highlighting of string annotations (#22878)
  • Include setters and deleters when renaming properties (#22999)
  • Show type qualifiers like Final in on-hover hints (#23005)

Configuration

  • Add new unused-type-ignore-comment rule (#22790)
  • Add a mechanism to ignore/warn/select all rules (#22832)
  • Support multiple workspace folders in a single ty LSP server instance (#22953)
  • Only add ./src as a search path if ./src/__init__.py(i) does not exist (#22851)

Type checking

  • Add a diagnostic detecting if a variable is declared as Final but never has any bindings (#23001)
  • Add a diagnostic detecting overridden comparison dunder methods on order=True dataclasses (#22689)
  • Add a hint to invalid-argument-type and invalid-assignment diagnostics if a variable is annotated with a type from the numbers module (#22931, #22938)
  • Add diagnostic hint on unresolved-reference to suggest using "list" instead of "List" (#22827)
  • Add new diagnostic for invalid dataclass field orders (#19825)
  • Allow a subclass method with a positional-only parameter to override a superclass method without that parameter if the parameter in the subclass method has a default value (#23037)
  • Allow self-referential imports outside the global scope (#22963)
  • Ban ... in odd places inside tuple specializations (#22889)
  • Ban Required, NotRequired and ReadOnly in parameter annotations (#22888)
  • Ban legacy TypeVar bounds or constraints from containing type variables (#22949)
  • Ban multiple unpacked variadic tuples in a tuple specialization (#22884)
  • Detect generic Callables in the return type of function signatures (#22954)
  • Detect invalid isinstance() and issubclass() calls against TypedDict classes (#22887)
  • Detect invalid issubclass() calls against Protocol classes with non-method members (#22896)
  • Detect invalid attempts to subclass Protocol[] and Generic[] simultaneously (#22948)
  • Emit a diagnostic on incorrect applications of the legacy convention for specifying positional-only parameters (#22943)
  • Emit an error if a TypeVarTuple is used to subscript Generic or Protocol without being unpacked (#22952)
  • Fallback to metaclass __getattr__ or __getattribute__ when looking up attributes on class objects (#22985)
  • Fix a bug where an overridden type in a dataclass subclass would not be respected if the dataclass subclass field had a default value but the superclass field did not (#22965)
  • Improve bidirectional type inference involving PEP-695 type aliases (#22989)
  • Improve detection of invalid NewTypes with generic bases (#22961)
  • Improve reachability analysis when evaluating the truthiness of expressions that involve variables that may not be bound in all code paths (#22971)
  • Improve the error message if ** is used with a non-mapping in the context of a call to an overloaded function (#22921)
  • Infer ParamSpec from class constructors for callable protocols (#22853)
  • Move the location of some invalid-overload diagnostics (#22933)
  • Point to an overload with an invalid @final decorator when emitting invalid-overload errors for invalid @final decorators (#22893)
  • Avoid false positives when iterating over an instance of an intersection with only negated elements by preserving "pure negation" types in descriptor lookups (#22907)
  • Promote Literal types when inferring elements for very large unannotated tuples, for improved performance (#22841)
  • Recognize functions with stub bodies in Protocol classes as implicitly abstract (#22838)
  • Reduce false positives involving heterogeneous dicts by tracking dictionary literal keys as individual places (#22882)
  • Reduce false positives when subscripting classes generic over TypeVarTuples (#22950)
  • Remove special handling for Any() in match class patterns (#23011)
  • Support type[None] in type expressions (#22892)
  • Support legacy namespace packages declared using pkg_resources.declare_namespace (#22987)
  • Sync vendored typeshed stubs (#23006), Typeshed diff
  • Validate signatures of dataclass __post_init__ methods (#22730)

Contributors

0.0.14

Released on 2026-01-26.

Bug fixes

  • Consider keyword arguments when unpacking a variadic argument (#22796)
  • Fix binary operator false-positive for constrained TypeVars (#22782)
  • Fix docstring rendering for literal blocks after doctests (#22676)
  • Fix false-positive unsupported-operator for "symmetric" TypeVars (#22756)
  • Fix panic when overriding a final method using an assignment (#22831)
  • Fix unary operator false-positive for constrained TypeVars (#22783)
  • Fix generic functions with a generic (ParamSpec) decorator (#22544)
  • Fix memo.changed_at assertion panics (#22498)

LSP server

  • Look up attributes on metaclasses for Go to Definition (#22758)
  • Suppress type inlay hints for leading-underscore assignments (#22855)

Configuration

  • Add allowed-unresolved-imports setting (#22800)

Other changes

  • Add assert-type-unspellable-subtype diagnostic, for failed assert_type() where the actual type is a subtype of the named type that can't be spelled in a type expression (#22815)
  • Add a new empty-body return code for functions with stub bodies that have non-None return annotations (#22846)
  • Add diagnostic disambiguation for different type aliases with the same name (#22852)
  • Add support for dict literals and dict() calls as default values for parameters with TypedDict types (#22161)
  • Add support for subscripts on intersections (#22654)
  • Avoid duplicate syntax errors for await outside functions (#22826)
  • Emit an error if the same type parameter appears more than once in a Generic[] subscript (#22738)
  • Emit diagnostic for unimplemented abstract method on @final class (#22753)
  • Fix GitLab Code Quality output format for empty diagnostics (#22833)
  • Fix assignment in decorated method causing Unknown fallback (#22778)
  • Fix false negative when using a non-runtime-checkable protocol in a match class pattern (#22836)
  • Improve completion rankings for raise-from/except contexts (#22775)
  • Improve invalid assignment diagnostics with type context (#22643)
  • Improve support for kwarg splats in dictionary literals (#22781)
  • Infer TypedDict types with >=1 required key as being always truthy (#22808)
  • Point to an overload with an invalid @final decoator when emitting invalid-overload errors for invalid @final decorators (#22812)
  • Require both *args and **kwargs when calling a ParamSpec callable (#22820)
  • Stricter validation of TypedDict definitions (#22811)
  • Support recursive and stringified annotations in functional typing.NamedTuples (#22718)
  • Support solving generics involving PEP 695 type aliases (#22678)
  • Use a more lenient fallback type for failed namedtuple() and NamedTuple calls (#22765)
  • Use type context from augmented assignment dunder calls (#22540)
  • Check that starred arguments in function calls are iterable (#22805)

Contributors

0.0.13

Released on 2026-01-21.

Bug fixes

  • Fix --force-exclude when excluding entire directories (#22595)
  • Fix missing syntax highlighting for aliased import names (#22675)
  • Highlight interpolated-parts in t-strings (#22674)
  • Fix the inferred MRO of functional namedtuple classes (#22722)
  • Make special cases for subscript inference exhaustive, ensuring that the special casing for tuple subscripts is applied when a union of tuples or an alias to a tuple type is subscripted (#22035)

LSP server

  • Improve completion suggestions inside class definitions (#22571)
  • Improve performance of completions (#22630)
  • Remove completion suggestions for redundant re-exports that share the same top-most module (#22581)

Core type checking

  • Add basic support for overloads in ParamSpec (#21946)
  • Allow ... as a default value for any parameter if the function is in an if TYPE_CHECKING block (#22624)
  • Allow if type(x) is Y narrowing for types other than class-literal types (#22729)
  • Avoid overload errors when detecting dataclass-on-tuple (#22687)
  • Avoid reporting overload errors for successful union variants (#22688)
  • Ban NewTypes with generic bases (#22653)
  • Fix PEP 695 type aliases not expanding in overload resolution (#22589)
  • Fix the return type for synthesized NamedTuple.__new__ methods (#22625)
  • Emit diagnostics for NamedTuple, TypedDict, Enum or Protocol classes decorated with @dataclass (#22672)
  • Emit invalid-type-form diagnostics for stringified annotations where the quoted expression is invalid (#22752)
  • Infer the implicit type of cls in __new__ methods (#22584)
  • Make ModuleType and object attributes available on namespace packages (#22606)
  • Make NamedTuple(...) and namedtuple(...) calls stricter (#22601)
  • Narrow on bool and byte subscripts (#22684)
  • Narrow on negative subscript indexing (#22682)
  • Override __file__ to str when applicable on imported modules (#22333)
  • Add bidirectional inference for comprehensions (#22564)
  • Recognize string-literal types as subtypes of Sequence[Literal[chars]] (#22415)
  • Add right-hand-side narrowing for if Foo is type(x) expressions (#22608)
  • Add simple syntactic validation for the right-hand side of PEP-613 type aliases (#22652)
  • Add support for passing typename and field_names by keyword argument to collections.namedtuple() calls (#22660)
  • Add support for starred unpacking in class bases (#22591)
  • Validate constructor arguments when a class is used as a decorator (#22377)
  • Validate field names for typing.NamedTuple(...) (#22599)
  • Add diagnostic on overridden __setattr__ and __delattr__ in frozen dataclasses (#21430)
  • Fix unary operators on NewTypes of float or complex (#22605)

Configuration

  • Support overriding respect-type-ignore-comments (#22615)

Diagnostics

  • Don't add a subdiagnostic pointing to the TypeVar definition if the TypeVar is Self (#22646)
  • Show final search path instead of "and 1 more paths" (#22776)
  • Group type[] elements together when displaying union types (#22592)

Performance

  • Cache ClassType::nearest_disjoint_base (#22065)

Other changes

Contributors

0.0.12

Released on 2026-01-14.

Bug fixes

  • Avoid panic that could occur when casting an object to a TypedDict or union of TypedDicts (#22509)
  • Fix incorrect narrowing for if type(x) == y (#22531)
  • Fix stack overflow with recursive type aliases containing tuple types (#22543)
  • functools.total_ordering: ensure the signatures of generated methods reflect the signature of the user-provided method (#22496)
  • Support dataclass_transform as a function call (#22378)
  • Use the top materialization of classes for if type(x) is y narrowing. For example, if type(x) is tuple will cause the type of x to be intersected with tuple[object, ...] rather than tuple[Unknown, ...]. (#22553)
  • Avoid emitting Liskov violations with respect to a grandparent class if such violations could not be fixed without introducing Liskov violations with respect to a parent class (#22484)
  • Fix interaction between classmethod, contextmanager, and Self (#22407)
  • Check contravariant type variable bounds contravariantly in specialization inference (#22488)
  • Fix false positive for bounded type parameters with NewType (#22542)

Core type checking

  • Add support for dynamic type() classes (#22291, #22499, #22537, #22480)
  • Add support for functional namedtuple creation (#22327, #22573, #22575, #22574)
  • Add a diagnostic for non-decorator uses of final (#22555)
  • Add diagnostic to catch generic enums (#22482)
  • Add diagnostics for __init_subclass__ argument mismatch (#22185)
  • Add diagnostics to validate TypeIs and TypeGuard definitions (#22300)
  • Apply type narrowing to walrus targets (#22369)
  • Detect invalid @total_ordering applications in non-decorator contexts (#22486)
  • Fix @Todo type for starred expressions (#22503)
  • Improve disambiguation of types in diagnostics (#22547)
  • Include type parameters in the display for generic Callable types (#22435)
  • Infer type[Unknown] for calls to type() when overload evaluation is ambiguous (#22569)
  • Support assignment to unions of TypedDicts (#22294)
  • Use the key and value parameter types as type context for __setitem__ dunder calls (#22148)
  • Narrow the right-hand side of ==, !=, is and is not conditions when the left-hand side is not narrowable (#22511)

LSP server

  • Fix __file__ type in completions to show str instead of str | None when the inferred type is str (#22510)
  • Improve rendering of ReST directives in docstrings (#22512)

Contributors

0.0.11

Released on 2026-01-09.

Bug fixes

  • Fix super() with TypeVar-annotated self and cls parameter (#22208)
  • Only consider fully static pivots when deriving transitive constraints (#22444)

LSP server

  • Don't show diagnostics for excluded files (#22455)
  • Fix goto definition for relative imports in third-party files (#22457)
  • Improve completion ranking based on origin and exact match (#22460)
  • Rank top-level module symbols above most other symbols (#22465)

Configuration

  • Enable unused-ignore-comment by default (#22474)

Performance

  • Improve UnionBuilder performance by changing Type::is_subtype_of calls to Type::is_redundant_with (#22337)
  • Optimize union building for unions with many enum-literal members (#22363)-

Other changes

  • Declare support for Python 3.14 (#2407)
  • Remove dark-mode handling from PyPI-uploaded README (#2422)

Contributors

0.0.10

Released on 2026-01-07.

Bug fixes

  • Fix stack overflow due to too small stack size (#22433)
  • Fix stale semantic tokens after opening the same document with new content (#22414)
  • Fix handling of ParamSpec in overloaded functions (#22416)
  • Fix comparisons and arithmetic with NewTypes of float (#22105)
  • Fix several issues with unannotated function return types (#22425)
  • Fix handling of subclasses in Callables (#22411)

LSP server

  • Add support for explicit markdown code fences in docstring rendering (#22373, #22408)
  • Offer completions for T when a value has type Unknown | T (#22436)
  • Sort keyword argument completions higher (#22297)

Core type checking

  • Add support for @total_ordering (#22181, #22183)
  • Better simplification of intersections of tuples (#22094)
  • Support comparisons between variable-length tuples (#21824)
  • Emit diagnostics for method definitions and other invalid statements in TypedDict class bodies (#22351)
  • Improve type-narrowing in calls to len() (#22330)

CLI

  • Add --add-ignore CLI option (#21696)

Configuration

  • include = ["myscript"] will now check myscript even though it doesn't have a Python extension (#22243)

Performance

  • Optimize intersections with a single negated element (#22344)
  • Optimize negated types (#22402)

Documentation

  • Link to Callable __name__ FAQ directly from unresolved-attribute diagnostic (#22437)

Contributors

0.0.9

Released on 2026-01-05.

Bug fixes

  • Emit a diagnostic if a class decorator is not a callable accepting a type (#22375)
  • Fix exhaustiveness inference for unions that include enums (#22290)

Core type checking

  • Support typing.TypeGuard (#20974)
  • Treat __setattr__ as fallback-only (#22014)
  • Don't expand type aliases via type mappings unless necessary. This means that the displayed signature of a bound methods will no longer eagerly expand type aliases into their aliased types (#22241)
  • Narrow TypedDict unions with not in (#22349)
  • Don't including property in subclasses properties (#22088)
  • Narrow tagged unions of TypedDicts in match statements (#22299)
  • Teach bidirectional inference about subtyping. This allows x to be inferred as list[int] for x: Iterable[int] = [42] (#21930)
  • Support narrowing for tagged unions of tuples where one element of the tuple is a Literal type (#22303)

LSP server

  • Add autocomplete suggestions for keyword arguments in class statements (#22110)
  • Avoid showing misleading inlay hint for unpacked tuple arguments (#22286)

Other changes

Contributors

0.0.8

Released on 2025-12-29.

Breaking changes

  • Rename non-subscriptable rule to not-subscriptable (#22193)

Core type checking

  • Promote float and complex when promoting literals (#22215)
  • Callable type of a type object is not function-like (#22226)
  • Fix and simplify callable type materializations (#22213)

LSP server

  • Add option to disable syntax errors (#22217)
  • Fix completion in decorators with missing declaration (#22177)
  • Better completions context detection when typing in decorator positions (#22224)
  • Limit the returned completions to reduce lag (#22240)

Diagnostics

  • Improve wording of unsupported-base sub-diagnostic (#22194)
  • Preserve the invalid assignment diagnostic message when implicitly shadowing a definition (#22219)

Other changes

  • Update docker image to use alpine 3.23 and trixie (#2217)

Contributors

0.0.7

Released on 2025-12-24.

Bug fixes

  • Fix classification of modules in import x as y for semantic syntax highlighting (#22175)
  • Fix module resolution on network drives (#22173)
  • Render the entire diagnostic message in all output formats (#22164)

Other changes

  • Add a dedicated diagnostic for TypedDict deletions (#22123)
  • Check __delitem__ instead of __getitem__ for del x[k] (#22121)
  • Fix @staticmethod combined with other decorators incorrectly binding self (#22128)
  • Fix implementation of Top[Callable[..., object]] (#22145)
  • Improve diagnostic when callable is used in a type expression instead of collections.abc.Callable or typing.Callable (#22180)
  • Improve diagnostic when a user tries to access a function attribute on a Callable type (#22182)
  • Include the specialization of a generic TypedDict as part of its display (#22174)
  • Support tuple narrowing based on member checks (#22167)
  • Synthesize __delitem__ for TypedDict to allow deleting non-required keys (#22122)

Contributors

0.0.6

Released on 2025-12-23.

Bug fixes

  • FIx panic from unexpanded type aliases in implicit tuple aliases (#22015)
  • Support type[T] where T is a type alias to a union of types (#22115)
  • Support == narrowing for tuples in unions with disjoint types (#22129)
  • Respect debug text interpolation in f-strings (#22151)
  • Fix panic from unstable union-type ordering in fixed-point iteration (#22070)

LSP server

  • Add ty.configuration and ty.configurationFile options (#22053)
  • Add diagnosticMode: off to disable diagnostics while retaining Go To Definition, etc. (#22073)
  • Set flag to avoid type[T@f] being inserted when you double-click on the inlay (#22139)
  • Use Markdown for completions documentation if the LSP client supports it (#21752)

CLI

  • Abort printing diagnostics when pressing Ctrl+C (#22083)

Configuration

  • Add respect-type-ignore-comments configuration option (#22137)
  • Support custom builtins via __builtins__.pyi (#22021)

Other changes

  • Bind self with instance in __get__ (#22155)
  • Support type inference between protocol instances (#22120)
  • Synthesize a precise _fields attribute for NamedTuples (#22163)
  • Synthesize a precise _replace method for NamedTuples (#22153)
  • Narrow "tagged unions" of TypedDicts (#22104)

Contributors

0.0.5

Released on 2025-12-20.

Bug fixes

  • Fix debug-mode server panic when a user typed a class definition by ensuring class arguments are visited in source order for semantic tokens (#22063)

LSP server

  • Classify docstrings in semantic tokens during syntax highlighting (#22031)

CLI

  • Add --force-exclude option (#22076)
  • Only clear output between two successful checks (#22078)

Other changes

  • Add support for dict(...) calls in TypedDict contexts (#22113)
  • Speedup bidirectional type-checking involving large unions by avoiding narrowing on non-generic calls (#22102)
  • Simplify inferred types by avoiding storing multi-inference attempts (#22062, #22103)
  • Improve union builder performance (#22048)
  • Only prefer declared types in non-covariant positions (#22068)
  • Respect intersections in iterations (#21965)
  • Sync vendored typeshed stubs (#22091). Typeshed diff
  • Understand that the type of X on an enum class will be int if X is defined using enum.nonmember in the class definition (#22025)

Contributors

0.0.4

Released on 2025-12-18.

LSP server

  • Add support for attribute docstrings (#22036)
  • Correctly encode multiline tokens for clients not supporting multiline tokens (#22033)
  • Autocompletions: Don't suggest keyword statements when only expressions are valid (#22002)
  • Fix goto-declaration on the right-hand side of from module import submodule (#22042)
  • Fix some configuration panics in the LSP (#22040)
  • Gracefully handle client requests that can't be deserialized (#22051)

Other changes

  • Improve performance for large match statements (#22045)
  • Disable possibly-missing-imports by default (#22041)
  • Implement disjointness for TypedDicts, significantly speeding up checking of code that uses pydantic (#22044)

Contributors

0.0.3

Released on 2025-12-17.

LSP server

  • Improve rendering of signatures in hovers (#22007)

Core type checking

  • Apply narrowing to len calls based on argument size (#22026)
  • Don't add identical lower/upper bounds multiple times when inferring specializations (#22030)
  • Improve unsupported-base and invalid-super-argument diagnostics to avoid extremely long lines when encountering verbose types (#22022)
  • Improve disambiguation of types in many cases (#22019)
  • Respect deferred values in keyword arguments etc. for .pyi files (#22029)
  • Handle field specifier functions that accept **kwargs and recognize metaclass-based transformers as instances of DataclassInstance (#22018)

Contributors

0.0.2

Released on 2025-12-16.

This is the first Beta release of ty, which we're now ready to recommend to motivated users for production use. See our blog post for more details.

LSP server

  • Improve display of completions to show actual insertion text (#21988)
  • Improve highlighting of special type syntax in hovers (#22005)
  • Improve syntax highlighting of constants (#22006)

Core type checking

  • Infer precise types for isinstance(…) calls involving type variables (#21999)
  • Infer TypeVar specializations for Callable types (#21551)
  • Propagate classmethod-ness through decorators returning Callables (#21958)
  • Improve rendering of default values for function args (#22010)
  • Don't use implicit superclass annotation when converting a class constructor into a Callable (#22011)

Other

  • Type checking performance improvement (#22000)

Contributors

0.0.1-alpha.35

Released on 2025-12-16.

Bug fixes

  • Fix panic for stringified comprehensions and boolean expressions in type expression (#21967)
  • Avoid stack overflow when determining inferable typevars (#21971)
  • Fix false-positive invalid-method-override diagnostic on method that uses Callable with a ParamSpec (#21934)
  • Disallow explicit specialization of type variables themselves (#21938)
  • Fix hover type on named expression ("walrus expression") targets (#21952)

LSP server

  • Add "qualify ..." code fix for undefined references (#21968)
  • Add new goto-definition targets on inlay hints (#21950)
  • Remove invalid statement-keyword completions in for-statements (#21979)

Core type checking

  • Add support for __qualname__ and other implicit class attributes (#21966)
  • Emit a diagnostic when a frozen dataclass inherits a non-frozen dataclass and vice versa (#21962)
  • Emit a diagnostic when a type variable with a default is followed by one without a default (#21787)
  • Improve diagnostics for unsupported binary operations and unsupported augmented assignments (#21947)
  • Improve check enforcing that an overloaded function must have an implementation (#21978)
  • Use unqualified names for displays of TypeAliasTypes and unbound ParamSpecs/TypeVars (#21960)

Performance

  • Speed up ty on Linux by using jemalloc (#21975)

Contributors

0.0.1-alpha.34

Released on 2025-12-12.

Bug fixes

  • Improve solving of a type variable with an upper bound when that type variable appears as one element in a union type (#21893)
  • Accurately emulate runtime semantics for kw_only=True dataclasses such that only fields declared in the immediate class body are understood as being keyword-only (#21820)
  • Avoid inferring types for invalid binary expressions in string annotations (#21911)
  • Fix logic used to determine whether two @final instance types are disjoint (#21769)
  • Fix logic used to determine whether two @final type[] types are disjoint (#21770)
  • Fix false-positive diagnostics that could arise when analysing cyclic types (#21910), (#21909)

LSP server

  • Fix outdated version in publish diagnostics after didChange (#21943)
  • Fix workspace symbols to return members too (#21926)
  • Adjust scope completions to use all reachable symbols (#21872)
  • Classify cls as class parameter for semantic highlighting (#21944)
  • Don't show on-hover tooltips for expressions with no inferred type (#21924)
  • Ignore __all__ for document and workspace symbol requests (#21928)
  • Recognize __all__ += submodule.__all__ in auto-import (#21918)
  • Stabilize rename (#21940)

Other changes

  • Support checking files without extensions (#21867)
  • Improve performance and semantics by deferring inference of all parameter and return-type annotations (#21906)
  • Improve resolution of absolute imports in tests (#21817)
  • Infer the implicit type of the cls parameter in @classmethod method bodies (#21685)
  • Support the implicit type of the cls parameter in signatures of @classmethod methods (#21771)
  • Uniformly use "not supported" in diagnostics (#21916)
  • Implement the equivalence relation for TypedDicts (#21784)
  • Ensure that the type of the class object C is always considered assignable to type[C[Unknown]] if C is a generic class (#21883)
  • Improve bad specialization results and error messages (#21840)
  • Support NewTypes of float and complex (#21886)

Contributors

0.0.1-alpha.33

Released on 2025-12-09.

Bug fixes

  • Fix assignability problem between tuple[Any, ...] and tuple[int, *tuple[int, ...]] (#21803)
  • Avoid diagnostic when typing_extensions.ParamSpec uses a default parameter (#21839)
  • Avoid crash for invalid Annotated subscript (#21837)
  • Avoid crash for invalid Final subscript (#21828)
  • Fix overload filtering to prefer more precise match when *args: Any is involved (#21859)
  • Handle various invalid explicit specializations for ParamSpec (#21821)
  • Fix stack overflow with recursive generic protocols (depth limit) (#21858)

LSP server

  • Add autocomplete suggestions for parameters in function calls (#21796)
  • Don't create a related diagnostic for the primary annotation of sub-diagnostics (#21845)
  • Stabilize auto-import (#21851)
  • Suppress inlay hints when assigning a trivial initializer call (#21848)
  • Use concise message for LSP clients not supporting related diagnostic information (#21850)
  • Fix add-import action for reveal_type (#21668)

Core type checking

  • Infer type variables within generic unions (#21862)
  • Type inference for @asynccontextmanager (#21876)
  • Make Python-version subdiagnostics less verbose (#21849)

Contributors

0.0.1-alpha.32

Released on 2025-12-05.

LSP server

  • Provide auto-import completion suggestions for modules in more situations (#21799)
  • Always register the ty server as a rename provider if the LSP client doesn't support dynamic registration (#21789)
  • Support auto-import of re-exported symbols in completion suggestions (#21779)
  • Support renaming import aliases (#21792)

Core type checking

  • Support ParamSpec (#21445)
  • Improve the accuracy of the inferred Callable supertype of generic classes (#21798)
  • Increase the limit on the number of elements in a non-recursively defined literal union (#21683)
  • Fix panics on mutually recursive generic protocols by normalizing the bounds/constraints of cyclic type variables (#21800)

Other changes

  • Minor improvements to assert_type diagnostics (#21811)
  • Fix a panic in recursive + generic type aliases (#21718)
  • Fix a panic when instantiating a type variable with invalid constraints (#21663)

Contributors

0.0.1-alpha.31

Released on 2025-12-04.

Bug fixes

  • Fix incorrect possibly-missing-attribute diagnostics for asyncio imports on Python 3.14 (#21776)
  • Fix panic for recursive type aliases (#21778)

Core type checking

  • Try ancestor pyproject.toml directories as search-paths if module resolution fails (#21745)
  • Sync vendored typeshed stubs (#21715) Typeshed diff

LSP server

  • Don't send publish diagnostics for clients supporting pull diagnostics (#21772)
  • Fix crash when hovering over string annotations with unknown symbols (#21782)

Diagnostics

  • Add subdiagnostic hint if the user wrote X = Any rather than X: Any (#21777)
  • Improve the display of various special-form types (#21775)

Contributors

0.0.1-alpha.30

Released on 2025-12-03.

Bug fixes

  • Fix exhaustiveness checking for match statements over unions of generic instance types (#21726)
  • Don't introduce invalid syntax when autofixing override-of-final-method (#21699)
  • Suppress false positives when dataclasses.dataclass(...)(cls) is called imperatively (#21729)
  • Fix false positives for class F(Generic[*Ts]): ... (#21723)
  • Don't confuse multiple occurrences of typing.Self when binding bound methods (#21754)
  • Fix subtyping between type[T] and a union type, where T is a type variable in scope (#21740)
  • Fix subtyping between type[T] and U, where T is a type variable in scope and U is a type variable not in scope (#21766)
  • Fix false positives for type[tuple[...]] (#21652)

Memory usage improvements

  • Significantly reduce memory usage (especially when ty is used as an LSP server) by enabling least-recently-used (LRU) cache eviction for module ASTs (#21749)

LSP server

  • Add code action to ignore diagnostic on the current line (#21595)
  • Exclude typing_extensions from autocomplete suggestions unless it's really available (#21731)
  • Fix auto-import code action to handle pre-existing imports (#21733)
  • Fix "find all references" for types defined in stub files (#21732)
  • Fix "find all references" for symbols defined via aliased imports (#21736)

Improvements to handling of type aliases

  • Default-specialize generic type aliases when they appear unspecialized in type expressions (#21765)
  • Infer a type alias as being a generic type alias if it includes a type variable in its definition, even in cases where the value subscripted with the type variable is inferred as having a dynamic type such as Any or Unknown (#21730)

New NamedTuple diagnostics

  • Detect NamedTuple classes that have field names starting with underscores, which is banned at runtime (#21697)
  • Add a diagnostic detecting overrides of prohibited NamedTuple attributes (#21717)
  • Detect illegal uses of super() in methods of NamedTuple classes (#21700)

Improvements to existing diagnostics

  • Improve diagnostics for unsupported comparison operations (#21737)
  • For invalid-type-arguments diagnostics, show the user where the type variable was defined (#21727)
  • Extend invalid-explicit-override to also cover properties decorated with @override that do not override anything (#21756)
  • Improve @override, @final and Liskov checks in cases where there are multiple reachable definitions (#21767)

Contributors

0.0.1-alpha.29

Released on 2025-11-28.

Bug Fix

  • Fix multiple panics due to recursive type definitions (#20566)

Type inference

  • Support type[T] where T is a type variable (#21650)
  • More precise inference for a failed specialization of a generic type (#21651)
  • Detect invalid overrides of methods that are marked as typing.final (#21646)
  • Fix subtyping of type[Any] / type[T] and protocols (#21678)
  • Added generics support for implicit and explicit (typing.TypeAlias) type aliases (#21553)

LSP server

  • Add import ... code action for unresolved references (#21629)
  • Include all members on type in autocompletion suggestions for type[] types (#21670)
  • Mark comprehension targets as definitions in semantic highlighting (#21636)
  • Add IDE autofixes for two "Did you mean...?" suggestions (#21667)
  • Prettier rendering of code:: lang in docstrings (#21665)
  • Support go-to for patterns and typevars (#21671)

Diagnostics

  • Add subdiagnostic hint if a variable with type Never is used in a type expression (#21660)
  • Improve diagnostic messages for invalid type arguments during explicit specialization (#21635)

Contributors

0.0.1-alpha.28

Released on 2025-11-25.

Bug fixes

  • Fix panic for unclosed string literal in type annotation position (#21592)

Type inference

  • Check method definitions on subclasses for Liskov violations (#21436)
  • Eagerly evaluate types.UnionType elements as type expressions (#21531)
  • Extend Liskov checks to also cover classmethods and staticmethods (#21598)
  • Implement typing.override (#21627)
  • Narrow type context during literal promotion in generic class constructors (#21574)
  • Retain the function-like-ness of Callable types when binding self (#21614)
  • Substitute for typing.Self when checking protocol members (#21569)
  • Implement TypedDict structural assignment (#21467)
  • Make implicit submodule imports re-exported (#21573)
  • Support PEP 613 typing.TypeAlias type aliases (#21394)
  • Support generic aliases in type[...], like type[C[int]] (#21552)
  • Tighten up handling of subscripts in type expressions (#21503)

LSP server

  • Improve go-to-definition and add go-to-definition for inlay hints (#21545, #21546, #21544, #21616, #21548)
  • Implement go-to-type for inlay type hints (#21533)
  • Add "remove unused ignore comment" code action (#21582)
  • Don't suggest completions that aren't subclasses of BaseException after raise (#21571)
  • Implement double click to insert inlay hint (#21600)
  • Fix edge cases for autocomplete suppressions in variable bindings (#21576)
  • Implement docstring rendering to markdown (#21550)
  • Support string annotations (#21577)
  • Improve import detection for completions and support from ...<CURSOR> completions (#21547)
  • Improve handling of hover/goto on imports (#21572)
  • Don't allow edits of some more invalid syntax types in inlay hints (#21621)
  • Resolve applicable overloads for hover on an overloaded function call (#21417)
  • Consistently add the DEFINITION modifier when computing semantic tokens (#21521)
  • Suppress autocomplete suggestions during variable binding (#21549)

CLI

  • Exit with code 2 if there's any IO error (#21508)

Diagnostics

  • Add hint about resolved Python version when a user attempts to import a member added on a newer version (#21615)
  • Attach subdiagnostics to unresolved-import errors for relative imports as well as absolute imports (#21554)
  • Avoid expression re-inference for diagnostics (#21267)
  • Improve message rendering of unused suppression diagnostic (#21580)
  • Improve concise diagnostics for invalid exceptions when a user catches a tuple of objects (#21578)
  • Improve diagnostics when NotImplemented is called (#21523)
  • Improve diagnostics when a submodule is not available as an attribute on a module-literal type (#21561)
  • Improve several "Did you mean?" suggestions (#21597)
  • Switch the error code from unresolved-attribute to possibly-missing-attribute for submodules that may not be available (#21618)

Other

  • Improve debug messages when imports fail (#21555)

Contributors

0.0.1-alpha.27

Released on 2025-11-18.

Bug fixes

  • Fix panic for cyclic star imports (#21428)
  • Fix crashes when using a homebrew Python install (#21405)
  • Fix incorrect inference of enum.auto() for enums with non-int mixins, and imprecise inference of enum.auto() for single-member enums (#20541)
  • Fix global symbol lookup from eagerly executed scopes such as comprehensions and classes (#21317)
  • Fix false positive for instance attributes that are declared as Final in the class body but have their value assigned in the class's __init__ method (#21158)
  • Use the return type of __get__ for descriptor lookups even when __get__ is called with incorrect arguments (#21424)
  • Consider parameters being declared global a syntax error (#21312)

Type inference

  • Support typing.NewType (#21157)
  • Support Callable in implicit type aliases (#21496)
  • Support typing.Union in implicit type aliases (#21363)
  • Precise inference for generator expressions (#21437)
  • Support storing attributes in comprehension scopes (#20856)
  • Support isinstance() and issubclass() narrowing when the second argument is a typing.py stdlib alias (#21391)
  • Support type[…] and Type[…] in implicit type aliases (#21421)
  • Support attribute-expression TYPE_CHECKING conditionals (#21449)
  • Support class-arguments for dataclass transformers (#21457)
  • Support legacy typing special forms in implicit type aliases (#21433)
  • Support stringified annotations in value-position Annotated instances (#21447)
  • Support all parameters of dataclass transforms (#21474)
  • Support __hash__ semantics and unsafe_hash for dataclasses (#21470)
  • Improve handling of version-specific features of dataclasses (#21453)
  • Correctly infer the specialization of a non-invariant PEP-695 generic class that has an annotated self parameter in its __init__ method (#21325)
  • Improve use of type context when inferring the result of a generic constructor call (#20933, #21442)
  • Improve use of type context when inferring the result of a generic call expression (#21210)
  • Improve heuristics used to decide when it is appropriate to "promote" a Literal type such as Literal[42] to its instance supertype (in this case, int) when solving type variables (#21439)
  • Improve use of type context to infer conditional expressions (#21443)
  • Make __getattr__ available for ModuleType instances (#21450)
  • Introduce implicit local variables for from imports of submodules in __init__.py(i) (#21173)
  • Make implicit submodule locals only occur in global scope of an __init__.py(i) (#21370)
  • Make implicit submodule locals also occur for absolute from imports in __init__.py(i) files (#21372)
  • Consider from thispackage import y a re-export of y in __init__.pyi (#21387)
  • Allow PEP-604 unions in stubs and TYPE_CHECKING blocks prior to 3.10 (#21379)
  • Ensure annotation/type expressions in stub files are always deferred (#21401, #21456)
  • Silence false-positive diagnostics when using typing.Dict or typing.Callable as the second argument to isinstance() (#21386)
  • Sync vendored typeshed stubs (#21466). Typeshed diff

LSP server

  • Support for notebooks in VS Code (#21175)
  • Fix goto-definition for float and complex in type annotation positions (#21388)
  • Support goto-definition on call argument inlay hints (#20349)
  • Add more keywords to scope-based completions (#21383)
  • Add synthetic members to completions on dataclasses (#21446)
  • Only suggest the import keyword in autocompletions for from <name> <CURSOR> statements (#21291)
  • Suppress completion suggestions following as tokens (#21460)
  • Suppress invalid suggestions in import statements (#21484)
  • Suppress redundant inlay hints for function args (#21365)
  • Suppress some trivial expression inlay hints (#21367)
  • Suppress inlay hints for +1 and -1 (#21368)
  • Improve semantic token classification for names (#21399)
  • Classify parameter declarations as definitions when computing semantic tokens (#21420)

Diagnostics

  • Better invalid-assignment diagnostics (#21476)
  • Better concise diagnostic messages (#21498)
  • Improve subscript assignment diagnostics (#21411, #21452)
  • Improve diagnostic range for non-subscriptable diagnostics (#21461)
  • Improve diagnostics for invalid exceptions (#21475)
  • Add hyperlinks to rule codes in CLI (#21502)

Performance improvements

  • Cache computation of dataclass/NamedTuple/TypedDict fields (#21512)
  • Faster subscript assignment checks for (unions of) TypedDicts (#21378)
  • Reduce memory allocations for string-literal types (#21497)

Contributors

0.0.1-alpha.26

Released on 2025-11-10.

Bug fixes

  • Language server: For semantic tokens, fix range filtering for tokens starting at the end of the requested range (#21193)
  • Fix panic due to simplifying Divergent types out of intersections types (#21253)
  • Fix merging of --exclude CLI flag and src.exclude config-file setting (#21341)

Type inference

  • Infer type of self for decorated methods and properties (#21123)
  • Add support for properties that return Self (#21335)
  • Understand legacy and PEP 695 ParamSpec (#21139)
  • Type inference for comprehensions (#20962)
  • Reachability and narrowing for enum methods (#21130)
  • Implicit type aliases: Support for PEP 604 unions, Literals, Optional, and Annotated (#21195, #21296, #21321)
  • dict is not assignable to TypedDict (#21238)
  • Allow values of type None in type expressions (#21263)
  • Add narrowing for isinstance() and issubclass() checks that use PEP-604 unions (#21334)
  • Do not promote Literal types when solving type variables in contravariant positions (#21164, https://github.com/astral-sh/ruff/pull/21171))
  • Fix lookup of __new__ methods on instances (#21147)
  • Fix narrowing of generic classes in class patterns for match statements (#21150)
  • Improve understanding of disjointness for @final classes (#21167)
  • Fix the inferred signature of the synthesized __init__ method of a non-dataclass inheriting from a generic dataclass (#21159)
  • Improve exhaustiveness analysis for type variables with bounds or constraints (#21172)
  • Prefer exact matches when solving constrained type variables (#21165)
  • Simplify unions containing multiple type variables during inference (#21275)
  • Use the declared attribute type when inferring union attribute assignments (#21170)
  • Sync vendored typeshed stubs (#21178). Typeshed diff
  • Use declared attribute types as type context when solving type variables (#21143)
  • Don't union in the inferred type of a parameter's default value when inferring the type of an annotated parameter (#21208)
  • Support subscripting typing.Literal with a type alias (#21207)

LSP server

  • Don't provide completions when in a class or function definition (#21146)
  • Favor symbols defined in the current file over imported symbols (#21194) and builtin symbols (#21285)

Diagnostics

  • Add diagnostics for isinstance() and issubclass() calls that use invalid PEP-604 unions for their second argument (#21343)
  • Don't assume in diagnostic messages that a TypedDict key error is about subscript access (#21166)

Other changes

  • Consistently wrap tokens in parser diagnostics in backticks instead of 'quotes' (#21163)
  • Discover the site-packages directory from the environment that ty is installed in (#21286), improving the ergonomics of uvx ty check
  • Support implicit imports of submodules in __init__.pyi (#20855)
  • Use "cannot" consistently over "can not" in diagnostics (#21255)
  • Resolve from foo import bar to the foo.bar submodule rather than using the __getattr__ function in foo/__init__.py (in situations where they both exist)(#21260)

Contributors

0.0.1-alpha.25

Released on 2025-10-29.

Bug fixes

  • Fix bug where ty would think all types had an __mro__ attribute (#20995)
  • Fix rare panic with highly cyclic TypeVar definitions (#21059)
  • Fix infinite recursion with generic type aliases (#20969)
  • Add missing newline before first diagnostic in CLI output (#21058)
  • Make the ty server's auto-import feature skip symbols in the current module (#21100)
  • Don't provide goto-definition for definitions which are not reexported in builtins (#21127)
  • Avoid duplicate diagnostics during multi-inference of standalone expressions (#21056)

Type inference and diagnostics

  • Use constructor parameter types as context to inform solving type variables (#21054)
  • Consider __len__ when determining the truthiness of an instance of a tuple class or a @final class (#21049)
  • Delegate truthiness inference of an enum Literal type to its enum-instance supertype (#21060)
  • Improve invalid-argument-type diagnostics where a union type was provided (#21044)

LSP server

  • Suggest type_check_only items last in completions (#20910)
  • Render import <...> in completions when "label details" isn't supported (#21109)
  • Update workspace diagnostic progress every 50ms (#21019)

CLI

  • Add --no-progress option to suppress the rendering of a progress bar (#21063)

Contributors

0.0.1-alpha.24

Released on 2025-10-23.

Breaking changes

  • Rename unknown-rule lint to ignore-comment-unknown-rule (#20948)

Type inference and diagnostics

  • Infer a type of Self for unannotated self parameters in methods (#20922)
  • Prefer the declared type over the inferred type for invariant collection literals (#20927)
  • Use declared variable types as bidirectional type context for solving type variables (#20796)
  • Support dataclass_transform for base class models (#20783)
  • Support dataclass-transform field_specifiers (#20888)
  • dataclass_transform support for fields with an alias (#20961)
  • Add support for legacy namespace packages (#20897)
  • Add suggestion to "unknown rule" diagnostics (#20948)
  • Improve error messages for "unresolved attribute" diagnostics (#20963)
  • Avoid unnecessarily widening generic specializations (#20875)
  • Truncate Literal type display in some situations (#20928)

Bug fixes

  • Fix panic involving cyclic TypeVar default (#20967)
  • Fix panic involving ever-growing default types (#20991)
  • Fix panic involving infinitely expanding implicit attribute types (#20988)
  • Fix autocomplete suggestions when the cursor is at the end of a file (#20993)
  • Fix inconsistent highlighting of self (#20986)
  • Fix out-of-order semantic token for function with regular argument after kwargs (#21013)
  • Fix panic on recursive class definitions in a stub that use constrained type variables (#20955)
  • Fix panic when attempting to validate the members of a protocol that inherits from a protocol in another module (#20956)
  • Fix rare hang relating to multithreading (#21038)
  • Fix non-deterministic overload function inference (#20966)
  • Fix auto-import edits made by autocompletions for files with an existing from __future__ import (#20987)

LSP server

  • Support goto-definition for binary and unary operators (#21001)
  • Support goto-definition on vendored typeshed stubs (#21020)
  • Provide completions on TypeVars (#20943)
  • Display variance when hovering over type variables (#20900)
  • Avoid sending an unnecessary "clear diagnostics" message for clients supporting pull diagnostics. (#20989)

Other changes

  • Report continue and break statements outside loops as syntax errors (#20944)

Contributors

0.0.1-alpha.23

Released on 2025-10-16.

Bug fixes

  • Fix handling of dataclass field()s without default values (#20914)
  • Fix false-positive diagnostics on super() calls (#20814, #20843)
  • Fix match pattern value narrowing to use equality semantics (#20882)
  • Fix "missing root" panic when handling completion requests (#20917)
  • Fix overwriting of declared base class attributes through undeclared subclass members (#20764)
  • Fix runaway execution time for mutually referential instance attributes (#20645)

CLI

  • For unresolved-import diagnostics, limit the shown import paths to at most five, unless in verbose mode (#20912)
  • Write files that are slow to type check to log output (#20836)
  • Remove "pre-release software" warning (#20817)

LSP server

  • Improve ranking of autocomplete suggestions (#20807)

Type inference and diagnostics

  • Use return type annotations as context for bidirectional type inference (#20528)
  • Use bidirectional type context for TypedDict construction (#20806)
  • Add support for unpacking of heterogeneous tuples in unions (#20377)
  • Add a new diagnostic for generic classes that reference typevars from an enclosing scope (#20822)
  • Add hint when accessing standard library module attributes that are not available on the configured Python version (#20909)
  • Treat functions, methods, and dynamic types as function-like Callables (#20842)
  • Treat Callables as bound-method descriptors in special cases (#20802)
  • Treat Callable dunder members as bound method descriptors (#20860)
  • Sync vendored typeshed stubs (#20876). Typeshed diff

Performance improvements

  • Improve performance by caching union simplification type relations (#20477)

Contributors

0.0.1-alpha.22

Released on 2025-10-10.

Bug fixes

  • Enforce that typing_extensions must come from a stdlib search path. This fixes a panic that could occur with a confusing backtrace if the extra-paths setting was incorrectly used to point to a virtual environment (#20715)
  • Fix server panic when opening a project located at / in the file system (#20684)
  • Fix panics when using --output-format=gitlab in CI environments (#20550)
  • Fix stack overflows that could occur when attempting to determine if a recursive NamedTuple type was disjoint from another type (#20538)
  • Fix panics in type inference when legacy TypeVars had bounds, constraints, or defaults that cyclically referred back to the TypeVar definition (directly or indirectly) (#20598)
  • Fix situations where a panic during resolution of type-checker query cycles would manifest in a hang (#20577)
  • When analyzing a .py file, do not error if there's also a .pyi for that module (#20461)
  • Recognise that the runtime object typing.Protocol is an instance of _ProtocolMeta (#20488)
  • Fix logic that attempted to determine whether a user had explicitly activated a Conda environment, which has implications for the search paths ty uses for module resolution (#20675)
  • Fix false negatives when iterables with the wrong type are unpacked into a function with a *args variadic parameter (#20511)

Support for Python 3.14

  • Use 3.14 as the default version (#20725, #20759, #20760)
  • Annotations are deferred by default for 3.14+ (#20799)
  • Fix false positives when accessing __annotate__ (Py3.14+) or __warningregistry__ as a module global (#20154)

Improvements to TypeVar solving and inference of generic types

  • Improve solving of a type variable T if it appears in a union with non-TypeVars (T | None, T | str | None, etc.) (#20749)
  • More precise type inference for dictionary literals (#20523)
  • When solving type variables, use type context to inform whether Literal types should be promoted to instance types (#20776)
  • Use annotated parameters as type context when solving type variables (#20635)
  • Correctly infer the return type of method calls when the method is annotated as returning Self (#20517, #20754)
  • Use type context for inference of generic function calls (#20476)
  • Use C[T] instead of C[Unknown] for the upper bound of Self (#20479)

Improvements to assignability, subtyping, and union simplification

  • Fix overly strict assignability implementation for intersections with negated gradual elements (#20773)
  • Ensure that C[Any] is understood as a subtype of C[object] if C is a covariant generic class (#20592)
  • Ensure that ~T is never considered to be assignable to T where T is a type variable (#20606)
  • Improve assignability/subtyping between two protocol types (#20368)
  • Simplify Any | (Any & T) to Any (#20593)
  • Optimise and generalise union/intersection simplification (#20602)
  • Make protocol satisfiability checks more principled when a protocol has a method member that is generic over type variables scoped to the function (#20568)
  • Fix subtyping of invariant generics specialized with Any, ensuring that (for example) list[Any] is not considered a subtype of list[Any] (#20650)

Server

  • Add LSP debug information command (#20379)
  • Add support for inlay hints on attribute assignment (#20485)

Improvements to diagnostics

  • Improve diagnostics when a positional-only parameter is passed using a keyword argument (#20495)
  • Improve disambiguations of class names in diagnostics (#20603, #20756)
  • Improve diagnostics for bad @overload definitions (#20745)
  • Truncate type display for long unions in some situations (#20730)
  • Rename "possibly unbound" diagnostics to "possibly missing" (#20492)

Improvements to enum support

  • Allow multiple aliases to point to the same member (#20669)
  • implement auto() for StrEnum (#20524)

Improvements to ty's @overload implementation

  • Support single-starred argument for overload call (#20223)
  • Filter overloads using variadic parameters (#20547)

Other typing semantics and features

  • Do not union the inferred type of a module-global symbol with Unknown for the symbol's type when accessed from external scopes (#20664)
  • Ensure that class objects are understood as callable even if they do not override object.__new__ or object.__init__ (#20521)
  • Add support for **kwargs (#20430)
  • Ensure first-party module-resolution search paths always appear in a sensible order (#20629)
  • Respect dataclass_transform parameters for metaclass-based models (#20780)
  • Sync vendored typeshed stubs (#20658). Typeshed diff
  • Bring ty's TypeIs narrowing behaviour closer to ty's narrowing behaviour for isinstance() checks. (#20591)
  • dataclass_transform: Support frozen_default and kw_only_default (#20761)
  • Allow any string Literal type expression as a key when constructing a TypedDict (#20792)
  • Add --venv as an alias to --python on the command line (#20718)
  • Add search paths listed in PYTHONPATH to search paths used for ty's module resolution (#20441, #20490)

Contributors

0.0.1-alpha.21

Bug fixes

  • Fix inference of constructor calls to generic classes that have explicitly annotated self parameters in their __init__ methods (#20325)
  • Fix a stack overflow when computing completions for recursive types (#20354)
  • Fix panic in BoundMethodType::into_callable_type() (#20369)
  • Fix stack overflows in binary comparison inference (#20446)
  • Fix many "too many cycle iterations" panics concerning recursive type aliases and/or recursive generics (#20359)
  • Fix stack overflow involving subtype checks for recursive type aliases (#20259)
  • Fix panic when inferring the type of an infinitely-nested-tuple implicit instance attribute (#20333)

Server

  • Add autocomplete suggestions for unimported symbols (#20207, #20439)
  • Include generated NamedTuple methods such as _make, _asdict and _replace in autocomplete suggestions (#20356)

Configuration

  • Automatically add python/ to environment.root if a python/ folder exists in the root of a repository (#20263)

CLI

  • Add GitHub output format (#20358)
  • Add GitLab output format (#20155)

Typing semantics and features

  • Add support for generic PEP-695 type aliases (#20219)
  • Allow annotation expressions to be ast::Attribute nodes (#20413)
  • Allow protocols to participate in nominal subtyping as well as structural subtyping (#20314)
  • Attribute access on top/bottom materializations (#20221)
  • Bind Self type variables to the method, not the class (#20366)
  • Ensure various special-cased bound methods are understood as assignable to Callable (#20330)
  • Ensure various special-cased builtin functions are understood as assignable to Callable (#20331)
  • Fall back to object for attribute access on synthesized protocols (#20286)
  • Fix signature of NamedTupleLike._make (#20302)
  • Fix subtyping/assignability of function- and class-literal types to callback protocols (#20363)
  • Implement the legacy PEP-484 convention for indicating positional-only parameters (#20248)
  • Infer more precise types for collection literals (#20360)
  • Make TypeIs invariant in its type argument (#20428)
  • Narrow specialized generics using isinstance() (#20256)
  • Proper assignability/subtyping checks for protocols with method members (#20165)
  • Reduce false positives for ParamSpecs and TypeVarTuples (#20239)
  • Overload evaluation: retry parameter matching for argument type expansion (#20153)
  • Simplify unions of enum literals and subtypes thereof (#20324)
  • Support "legacy" typing.Self in combination with PEP-695 generic contexts (#20304)
  • Treat Hashable, and similar protocols, equivalently to object for subtyping/assignability (#20284)
  • Treat __new__ as a static method (#20212)
  • TypedDict: Add support for typing.ReadOnly (#20241)
  • Detect syntax errors stemming from yield from expressions inside async functions (#20051)
  • "foo".startswith is not an instance of types.MethodWrapperType (#20317)
  • Eliminate definitely-impossible types from union in equality narrowing (#20164)
  • Infer more precise types for the name and value properties on enum members (#20311)
  • Initial support for slots=True in dataclasses (#20278)
  • Improve type narrowing in situations involving nested functions (#19932)
  • Support type aliases in binary comparison inference (#20445)
  • Sync vendored typeshed stubs (#20394). Typeshed diff

Diagnostics

  • Improve specialization-error diagnostics (#20326)

Contributors

0.0.1-alpha.20

Bug fixes

  • Server: Cancel background tasks when shutdown is requested (#20039)
  • Server: Close signature help after ) (#20017)
  • Server: Fix incorrect docstring in call signature completion (#20021)
  • Fix 'too many cycle iterations' for unions of literals (#20137)
  • Fix namespace packages that behave like partial stubs (#19994)
  • Fix server hang (unchanged diagnostics) when changing file on Windows (#19991)
  • Apply KW_ONLY sentinel only to local fields (#19986)
  • Ignore field specifiers when not specified in @dataclass_transform (#20002)

Server

  • Add completion support for import and from ... import statements (#19883)
  • Add type as detail to completion items (#20047)
  • Ask the LSP client to watch all project search paths (#19975)
  • Fix incorrect inlay hint type (#20044)
  • Update goto definition, goto declaration and hover to consider constructor method (__init__) (#20014)
  • Add docstrings to completions based on type (#20008)
  • Fix goto targets for keyword arguments in nested function calls (#20013)
  • Introduce multiline pretty printer to render function signatures across multiple lines (#19979)

Configuration

  • Distinguish base conda from child conda (#19990)

Typing semantics and features

  • Add support for PEP 750: t-strings (#20085)
  • Add support for PEP 800: Disjoint bases (#20084)
  • Add precise inference for unpacking a TypeVar if the TypeVar has an upper bound with a precise tuple spec (#19985)
  • Add precise iteration and unpacking inference for string literals and bytes literals (#20023)
  • Completely ignore typeshed's stub for Any (#20079)
  • Enforce that an attribute on a class X must be callable in order to satisfy a member on a protocol P (#20142)
  • Evaluate static truthiness of non-definitely-bound symbols to "ambiguous" (#19579)
  • Fix the inferred interface of specialized generic protocols (#19866)
  • Infer slightly more precise types for comprehensions (#20111)
  • Disable boundness analysis for implicit instance attributes (#20128)
  • Add Top[] and Bottom[] special forms (#20054)
  • Preserve qualifiers when accessing attributes on unions/intersections (#20114)
  • Strict validation of protocol members (#17750)
  • Support __init_subclass__ (#20190)
  • Unpack variadic argument type in specialization (#20130)
  • Use invalid-assignment error code for invalid assignments to ClassVars (#20156)
  • Use specialized parameter type for overload filter (#19964)
  • __class_getitem__ is a classmethod (#20192)
  • Add cycle detection for find_legacy_typevars (#20124)
  • Add support for cyclic legacy generic protocols (#20125)
  • Don't eagerly unpack aliases in user-authored unions (#20055)
  • Don't mark entire type-alias scopes as Deferred (#20086)
  • Ensure union normalization really normalizes (#20147)
  • Improve cycle-detection coverage for apply_type_mapping (#20159)
  • Linear variance inference for PEP-695 type parameters (#18713)
  • Minor TypedDict fixes (#20146)
  • Typecheck dict methods for TypedDict (#19874)
  • Validate constructor call of TypedDict (#19810)
  • Sync vendored typeshed stubs (#20031, #20083, #20188) Typeshed diff

Diagnostics

  • Add search paths info to unresolved import diagnostics (#20040)
  • Better error message for attempting to assign to a read-only property (#20150)
  • Improve diagnostics for bad calls to functions (#20022)
  • Improve disambiguation of types via fully qualified names (#20141)
  • Print diagnostics with fully qualified name to disambiguate some cases (#19850)

Performance

  • Avoid unnecessary argument type expansion (#19999)
  • Limit argument expansion size for overload call evaluation (#20041)
  • Optimize TDD atom ordering (#20098)

Contributors

0.0.1-alpha.19

Bug fixes

  • Fix false-positive diagnostics if a function parameter is annotated with type[P] where P is a protocol class (#19947)
  • Fix ANSI colors in terminal output on old Windows terminals (#19984)
  • Fix protocol interface inference for protocols in stub files with ClassVar members and "subprotocols" that extend other protocols (#19950)
  • Fix inference of equality comparisons between enum members (#19666)
  • Remove incorrect type narrowing for if type(x) is C[int] (#19926)
  • Improve detection of TypeErrors resulting from protocol classes illegally inheriting from non-protocol classes (#19941). We previously detected this error, but only when the protocol class illegally inherited from a non-generic class or an unspecialized generic class. We now also detect it when the protocol class inherits from a specialized generic class.
  • Fix incorrectly precise type inference in some situations involving nested scopes (#19908)
  • Fix unpacking a type alias with a precise tuple spec (#19981)

NamedTuple semantics improvements

  • Synthesize read-only properties for all declared members on NamedTuple classes (#19899)
  • Allow any instance of a NamedTuple class to be passed to a function parameter annotated with typing.NamedTuple (#19915)
  • Detect NamedTuple classes where fields without default values illegally follow fields with default values (#19945). This causes TypeError to be raised at runtime.
  • Detect illegal multiple inheritance with NamedTuple (#19943). This causes TypeError to be raised at runtime.

Other typing and semantics improvements

  • Add support for stubs packages with partial in their py.typed files (#19931)
  • Look for site-packages directories in <sys.prefix>/lib64/ as well as <sys.prefix>/lib/ on non-Windows systems (#19978). This change fixes a number of unresolved-import false-positive diagnostics reported by Poetry users.
  • Add diagnostics for invalid await expressions (#19711)
  • Add else-branch narrowing for if type(a) is A when A is @final (#19925)
  • Improve solving of typevars with defaults, and typing.Self (#19786)
  • Support the kw_only parameter for dataclasses.dataclass() and dataclasses.field() (#19677)
  • Sync vendored typeshed stubs (#19923). Typeshed diff.

Server improvements

  • Improve goto/hover for definitions (#19976)

Performance improvements

  • Short-circuit a server inlay hints request if all settings under ty.inlayHints are disabled (#19963)
  • Speedup server tracing checks (#19965)
  • Add caching to logic for inferring whether a class is a NamedTuple, a dataclass or a TypedDict (#19912)
  • Speedup project file discovery (#19913)

Contributors

0.0.1-alpha.18

Bug fixes

Server

  • Implement support for "rename" language server feature (#19551)
  • Add ty.experimental.rename server setting (#19800)
  • Add ty.inlayHints.variableTypes server setting (#19780)
  • Add inlay hints for call arguments (configured by ty.inlayHints.callArgumentNames server setting) (#19269)
  • Enable goto definition to jump to the runtime definition in the standard library for stdlib symbols (rather than the type definition in typeshed's stubs) (#19529)
  • Support LSP client settings (#19614)
  • Update goto range for attribute access to only target the attribute (#19848)
  • Warn users if the server received unknown options (#19779)
  • Render docstrings in hover (#19882)
  • Resolve docstrings for modules (#19898)

Typing semantics and features

  • Add precise inference for indexing, slicing and unpacking NamedTuple instances (#19560)
  • Disallow typing.TypedDict in type expressions (#19777)
  • Implement module-level __getattr__ support (#19791)
  • Improve ability to solve TypeVars when they appear in unions (#19829)
  • Improve subscript narrowing for collections.ChainMap, collections.Counter, collections.deque and collections.OrderedDict (#19781)
  • Extend all tuple special casing to tuple subclasses (#19669)
  • Use separate Rust types for bound and unbound type variables (#19796)
  • Validate writes to TypedDict keys (#19782)
  • typing.Self is bound by the method, not the class (#19784)
  • Fix deferred name loading in PEP695 generic classes/functions (#19888)
  • Improve handling of symbol-lookup edge cases involving class scopes (#19795)

Performance

  • Improve performance around tuple types (#19840)
  • Improve performance of subtyping and assignability checks for protocols (#19824)
  • Improve multithreaded performance for large codebases (#19867)

Memory usage optimizations

  • Reduce memory usage of TupleSpec and TupleType (#19872)
  • Reduce size of member table (#19572)

Contributors

0.0.1-alpha.17

Bug fixes

  • Always refresh diagnostics after a watched files change (#19697)
  • Correctly instantiate generic class that inherits __init__ from generic base class (#19693)
  • Don't panic with argument that doesn't actually implement Iterable (#19602)
  • Fix "peek definition" in playground (#19592)
  • Fix empty spans following a line terminator and unprintable character spans in diagnostics (#19535)
  • Fix incorrect diagnostic when calling __setitem__ (#19645)
  • Fix lookup order of class variables before they are defined (#19743)
  • Fix more false positives related to Generic or Protocol being subscripted with a ParamSpec or TypeVarTuple (#19764)
  • Keep track of type qualifiers in stub declarations without right-hand side (#19756)

Server

  • Add progress reporting to workspace diagnostics (#19616)
  • Add stub mapping support to signature help (#19570)
  • Added support for "document symbols" and "workspace symbols" (#19521)
  • Fix server panic in workspace diagnostics request handler when typing (#19631)
  • Implement caching for workspace and document diagnostics (#19605)
  • Implement long-polling for workspace diagnostics (#19670)
  • Implement streaming for workspace diagnostics (#19657)
  • Implemented support for "selection range" language server feature (#19567)

CLI

  • Add progress bar to --watch mode (#19729)
  • Clear the terminal screen in --watch mode (#19712)
  • Resolve file symlinks in src walk (#19674)

Typing semantics and features

  • Support async/await, async with and yield from (#19595)
  • Add support for async for loops and async iterables (#19634)
  • Don't include already-bound legacy typevars in function generic context (#19558)
  • Infer types for key-based access on TypedDicts (#19763)
  • Improve isinstance() truthiness analysis for generic types (#19668)
  • Infer type[tuple[int, str]] as the meta-type of tuple[int, str] (#19741)
  • Remove false positives when subscripting Generic or Protocol with a ParamSpec or TypeVarTuple (#19749)
  • Remove special casing for string-literal-in-tuple __contains__ (#19642)
  • Remove special casing for tuple addition (#19636)
  • Return Option<TupleType> from infer_tuple_type_expression (#19735)
  • Support as-patterns in reachability analysis (#19728)
  • Support __setitem__ and improve __getitem__ related diagnostics (#19578)
  • Synthesize precise __getitem__ overloads for tuple subclasses (#19493)
  • Track different uses of legacy typevars, including context when rendering typevars (#19604)
  • Upcast heterogeneous and mixed tuples to homogeneous tuples where it's necessary to solve a TypeVar (#19635)
  • Fix incorrect lazy scope narrowing (#19744)
  • Synthesize __replace__ for dataclasses (#19545)

Diagnostics

  • Add diagnostics for async context managers (#19704)
  • Display generic function signature properly (#19544)
  • Improve the Display for generic type[] types (#19667)
  • Remap Jupyter notebook cell indices in ruff_db (#19698)

Documentation

  • Add the ty badge (#897)

Contributors

0.0.1-alpha.16

Bug fixes

  • Fix server panics when hovering over invalid syntax in Callable annotations (#19517)
  • match statements: Fix narrowing and reachability of class patterns with arguments (#19512)
  • Fix server panics when hovering over illegal Literal[…] annotations with inner subscript expressions (#19489)
  • Pass down specialization to generic dataclass bases (#19472)

Server

  • Add support for "go to definition" for attribute accesses and keyword arguments (#19417)
  • Add support for "go to definition" for import statements (#19428)
  • Add support for "document highlights" (#19515)
  • Add partial support for "find references" (#19475)
  • Prefer the runtime definition, not the stub definition, on a go-to-definition request for a class or function. Currently this is only implemented for definitions originating outside of the stdlib. (#19471)
  • Add semantic token support for more identifiers (#19473)
  • Avoid rechecking the entire project when a file in the editor is opened or closed (#19463)

Typing semantics and features

  • Handle splatted arguments in function calls (#18996)
  • Improve place lookup and narrowing in lazy scopes (#19321)
  • Add exhaustiveness checking and reachability analysis for match statements (#19508)
  • Improve reachability analysis for isinstance(…) branches (#19503)
  • Make tuple subclass constructors sound (#19469)
  • Extend tuple __len__ and __bool__ special casing to also cover tuple subclasses (#19289)
  • Add support for dataclasses.field (#19553)
  • Add support for dataclasses.InitVar (#19527)
  • Add support for @warnings.deprecated and typing_extensions.deprecated (#19376)
  • Do not consider a type T to satisfy a method member on a protocol unless the method is available on the meta-type of T (#19187)
  • Implement expansion of enums into unions of literals (#19382)
  • Support iterating over enums (#19486)
  • Detect enums if metaclass is a subtype of EnumType / EnumMeta (#19481)
  • Infer single-valuedness for enums deriving from int or str (#19510)
  • Detect illegal non-enum attribute accesses in Literal annotations (#19477)
  • Disallow assignment to Final class attributes (#19457)
  • Handle implicit instance attributes declared Final (#19462)
  • Disallow Final in function parameter- and return-type annotations (#19480)
  • Disallow illegal uses of ClassVar (#19483)
  • Make del x force a local resolution of x in the current scope (#19389)
  • Perform type narrowing for places marked global (#19381)
  • Infer correct types for attribute accesses on intersections with negative parts (#19524)
  • Sync vendored typeshed stubs (typeshed diff). Typeshed diff

Memory usage optimizations

Contributors

0.0.1-alpha.15

Bug fixes

  • Avoid stale diagnostics for open-files diagnostic mode (#19273)
  • Fix inconsistent semantic syntax highlighting for parameters (#19418)
  • Fix checking of virtual files after re-opening from an unsaved edit (#19277)
  • Show the correct ty version in the LSP server (#19284)
  • Do not surface settings errors in unrelated Python files (#19206)
  • Do not ignore conditionally defined dataclass fields (#19197)
  • Fix panic for attribute expressions with empty value (#19069)
  • Fix assignabiliy of dataclasses to Callable types (#19192)
  • Fix __setattr__ call check precedence during attribute assignment (#18347)

Server

  • Add definition and declaration providers (go-to-definition, go-to-declaration) (#19371)
  • Add signature help provider (show signature and docstring when writing a call expression) (#19194)
  • Add "kind" to completion suggestions (#19216)
  • Add completions for submodules that aren't attributes of their parent (#19266)
  • Filter out private type aliases from stub files when offering autocomplete suggestions (#19282)
  • Handle configuration errors in the LSP more gracefully (#19262)
  • Use Python version and path from VSCode Python extension (#19012)
  • Publish errors in settings as LSP diagnostics (#19335)

Typing semantics and features

  • Add support for nonlocal statements (#19112)
  • Support empty function bodies in if TYPE_CHECKING blocks (#19372)
  • Emit a diagnostic when attempting to modify a typing.Final-qualified symbol (#19178)
  • Infer enum literal types when accessing enum members (#19328)
  • Synthesize __setattr__ for frozen dataclasses (#19307)
  • Improve equivalence for module-literal types (#19243)
  • Reduce false positives for TypedDict types (#19354)
  • Emit an error for global uses if there is no explicit definition in the global scope (#19344)
  • Sync vendored typeshed stubs (typeshed diff). Typeshed diff

CLI

  • Add a -q/--quiet mode, -qq for silent output mode (#19233)

Contributors

0.0.1-alpha.14

Bug fixes

  • Add cycle detection to ty's implementation of disjointness between types, fixing a possible source of stack overflows when analysing recursive types (#19139)
  • Don't allow first-party code to shadow the stdlib types module (#19128). This fixes another possible source of stack overflows.
  • Fix descriptor lookups for most types that overlap with None (#19120). This means that e.g. object().__str__() now correctly binds the self argument of the __str__ method, as the object type overlaps with None.

Server

  • Filter a symbol from a stub file in autocomplete suggestions if it is an implementation detail of the stub (#19121)
  • Add initial support for semantic tokens (#19108). This feature allows editors to apply more advanced syntax highlighting. Currently, the supported tokens are: Namespace, Class, Parameter, SelfParameter,ClsParameter, Variable, Property, Function, Method, Keyword, String, Number, Decorator, BuiltinConstant and TypeParameter.
  • Initial support for workspace diagnostics (#18939). Enable this feature by setting the ty.diagnosticMode configuration setting to "workspace".
  • Use Python syntax highlighting in on-hover content (#19082)

Typing semantics and features

  • Understand that calls to functions returning Never / NoReturn are terminal with respect to control flow (#18333)
  • Add subtyping between type[] types and Callable types (#19026)
  • Support bare ClassVar annotations (#15768)
  • Understand that two protocols with equivalent method members are equivalent (#18659)
  • Support declared-only instance attributes such as self.x: int (#19048)
  • Sync vendored typeshed stubs (#19174): typeshed diff
  • Use the inferred type as the declared type for bare Final symbols (#19142)

Contributors

0.0.1-alpha.13

Bug fixes

  • Fix stack overflows related to mutually recursive protocols (#19003)
  • Don't add incorrect subdiagnostic for unresolved-reference in staticmethods and classmethods (#18487)
  • Fix rendering of long lines in diagnostic messages that are indented with tabs (#18962)
  • Fix reachability of star import definitions for nonlocal lookups (#19066)

Typing semantics and features

  • Support variable-length tuples in unpacking assignments (#18948)
  • Allow declared-only class-level attributes to be accessed on the class (#19071)
  • Infer nonlocal types as unions of all reachable bindings (#18750)
  • Use all reachable bindings for instance attributes and deferred lookups (#18955)
  • Improve protocol member type checking and relation handling (#18847)
  • Rework disjointness of protocol instances vs types with possibly unbound attributes, preventing some false instances of Never in hasattr narrowing (#19043)
  • Make tuple instantiations sound (#18987)
  • Add subdiagnostic about empty bodies in more cases (#18942)
  • Improve type-inference for __import__(name) and importlib.import_module(name) (#19008)
  • Eagerly evaluate certain constraints when analyzing control flow (#18998, #19044, #19068)
  • Update typeshed stubs (#19060): typeshed diff

Server

  • Add builtins to completions (#18982)
  • Support LSP go-to with vendored typeshed stubs (#19057)

Documentation

Performance

  • Remove ScopedExpressionId (#19019)

Contributors

0.0.1-alpha.12

Bug fixes

  • Avoid duplicate diagnostic when reporting errors in unpacked assignments (#18897)
  • Fix panics when "pulling types" for ClassVar or Final parameterized with >1 argument (#18824). These could cause issues when hovering over symbols in an IDE.

Improved modeling of Python runtime semantics

  • Add support for @staticmethods (#18809)
  • Discover implicit class attribute assignments in @classmethod-decorated methods. Recognize that assignments in the body of a @staticmethod-decorated method are never instance attributes (#18587)
  • Report when a dataclass contains more than one KW_ONLY field (#18731)

Type narrowing improvements

  • Ty will now perform isinstance() and issubclass() narrowing when the second argument is a union type, intersection type or TypeVar type (#18900)
  • Ty now narrows types in comprehensions and generator expressions (#18934)
  • Understand two NominalInstanceTypes as disjoint types if attempting to use multiple inheritance with their underlying classes would result in an instance memory layout conflict (#18864)

Other typing semantics features

  • Support "mixed" tuples such as tuple[int, *tuple[str, ...]] (#18600, #18901)
  • Support type inference for subscript expressions on union types (#18846)
  • Introduce a new subtyping framework in which gradual types can participate, allowing for more advanced union type simplification (#18799)
  • Surface the matched overload directly when reporting a diagnostic for an invalid call to an overloaded function (#18452)

Improvements to server autocompletions

  • Add completions for from module import <CURSOR> (#18830)
  • Enforce sort order of completions (#18917)
  • Include imported sub-modules as attributes on modules for completions (#18898)

Configuration

  • Anchor all src.exclude patterns, for consistency with src.include patterns (#18685)
  • Change environment.root to accept multiple paths (#18913)
  • Rename src.root setting to environment.root (#18760)
  • Support --python=<symlink to executable> (#18827)

Contributors

0.0.1-alpha.11

Breaking changes

  • Stabilize auto-complete; remove the opt-in experimental setting (#18650)

Bug fixes

  • Fix binary expression inference between Boolean literals and bool instances (#18663)
  • Fix panic that could occur when printing a class's "header" in diagnostic messages (#18670)
  • Fix panic when attempting to provide autocompletions for an instance of a class that assigns attributes to self[0] (#18707)
  • Fix panics when "pulling types" for various special forms that have the wrong number of parameters. These could cause issues when hovering over symbols in an IDE. (#18642)

Typing semantics and features

  • Support type narrowing for attribute and subscript expressions (#17643)
  • Add partial support for TypeIs (#18589)
  • Support dataclasses.KW_ONLY (#18677)
  • Filter overloads based on Any / Unknown (#18607)
  • Improve reachability analysis (#18621)
  • Model T: Never as a subtype of Never (#18687)
  • Update typeshed stubs (#18679): typeshed diff

Configuration

  • Allow overriding rules for specific files (#18648)

Server

  • Add python.ty.disableLanguageServices config (#18230)

Contributors

0.0.1-alpha.10

Server

  • Improve support for object.<CURSOR> completions (#18629)

Configuration

  • Add file inclusion and exclusion (#18498)
  • Infer the Python version from --python=<system installation> on Unix (#18550)

Bug fixes

  • Delay computation of 'unbound' visibility for implicit instance attributes (#18669). This fixes a significant performance regression in version 0.0.1-alpha.9.

Typing semantics and features

  • Support the del statement; model implicit deletion of except handler names (#18593)

Release

  • Include ruff/ directory in release source tarballs (#617)

Contributors

0.0.1-alpha.9

Typing semantics and features

  • Add generic inference for dataclasses (#18443)
  • Add support for global __debug__ constant (#18540)
  • Argument type expansion for overload call evaluation (#18382)
  • Exclude members starting with _abc_ from a protocol interface (#18467)
  • Infer list[T] for starred target in unpacking (#18401)
  • Infer list[T] when unpacking non-tuple type (#18438)
  • Support type annotation for legacy typing aliases for generic classes (#18404)
  • Allow using dataclasses.dataclass as a function (#18440)
  • Type narrowing for attribute/subscript assignments (#18041)

Diagnostics

  • Add hints to invalid-type-form for common mistakes (#18543)
  • Add subdiagnostic suggestion to unresolved-reference diagnostic when variable exists on self (#18444)
  • Track the origin of the environment.python setting for better error messages (#18483)

CLI

  • Fix --python argument for Windows, and improve error messages for bad --python arguments (#18457)

Bug fixes

  • Meta-type of type variables should be type[..] (#18439)
  • Only consider a type T a subtype of a protocol P if all of P's members are fully bound on T (#18466)
  • Fix false positives for legacy ParamSpecs inside Callable type expressions (#18426)
  • Fix panic when pulling types for UnaryOp expressions inside Literal slices (#18536)
  • Fix panic when trying to pull types for attribute expressions inside Literal type expressions (#18535)
  • Fix panic when trying to pull types for subscript expressions inside Callable type expressions (#18534)
  • Treat lambda functions as instances of types.FunctionType (#18431)
  • Implement disjointness between Callable and SpecialForm (#18503)

Server

  • Fix stale diagnostics in documents on Windows (#18544)
  • Add support for object.<CURSOR> completions (#18468)
  • Only provide declarations and bindings as completions (#18456)

Documentation

  • Add CONDA_PREFIX to --python documentation (#18574)
  • Update list of referenced environment variables (#612)
  • Document how the default value for python-version is determined (#18549)
  • Document the "all" option for python-platform (#18548)

Contributors

0.0.1-alpha.8

Typing semantics and features

  • Add subtyping between Callable types and class literals with __init__ (#17638)
  • Implement implicit inheritance from Generic[] for PEP-695 generic classes (#18283)
  • Infer the Python version from the environment if feasible (#18057)
  • Support ephemeral uv virtual environments (#18335)
  • Model that some Callable types should have all FunctionType attributes available (#18242)

Diagnostics

  • Add diagnostic hints for a function that has a non-None return-type annotation but no return statements (#18359)
  • Add hint if async context manager is used in non-async with statement (#18299)
  • Improve diagnostics if the user attempts to import a stdlib module that does not exist on their configured Python version (#18403)
  • Tell the user why we inferred a certain Python version when reporting version-specific syntax errors (#18295)

Bug fixes

  • Fix multithreading related hangs and panics (#18238)
  • Ensure Literal types are considered assignable to anything their Instance supertypes are assignable to (#18351)
  • Callable types are disjoint from non-callable @final nominal instance types (#18368)
  • Support callability of bound/constrained typevars (#18389)

Server

  • Fix server hang after shutdown request (#18414)
  • Improve completions by leveraging scopes (#18281)
  • Support cancellation and retry in the server (#18273)
  • Support publishing diagnostics in the server (#18309)

CLI

  • Add --config-file CLI arg (#18083)

Contributors

0.0.1-alpha.7

Bug fixes

  • Implement Python's floor-division semantics for Literal ints (#18249)
  • Don't warn about a yield expression not being in a function if the yield expression is in a function (#18008)
  • Fix inference of attribute writes to unions/intersections that including module-literal types (#18313)
  • Fix false-positive diagnostics in binary comparison inference logic for intersection types (#18266)
  • Fix instance vs callable subtyping/assignability (#18260)
  • Ignore ClassVar declarations when resolving instance members (#18241)
  • Fix crash when hovering over a ty_extensions.Intersection[A, B] expression in an IDE context (#18321)
  • Respect MRO_NO_OBJECT_FALLBACK policy when looking up symbols on type instances (#18312)
  • get_protocol_members returns a frozenset, not a tuple (#18284)

Typing semantics and features

  • Support import <namespace> and from <namespace> import module (#18137)
  • Support frozen dataclasses (#17974)
  • Understand that the presence of a __getattribute__ method indicates arbitrary members can exist on a type (#18280)
  • Add a subdiagnostic if invalid-return-type is emitted on a method with an empty body on a non-protocol subclass of a protocol class (#18243)
  • Improve invalid-type-form diagnostic where a module-literal type is used in a type expression and the module has a member which would be valid in a type expression (#18244)
  • Split invalid-base error code into two error codes (#18245)
  • Rename call-possibly-unbound-method to possibly-unbound-implicit-call (#18017)

Configuration

  • Add tests to src.root by default if a tests/ directory exists and is not a package (#18286)
  • Tell the user why we inferred the Python version we inferred (#18082)
  • Add support for detecting activated Conda and Pixi environments (#18267)
  • Move respect-ignore-files configuration setting under src section (#18322)

Server

  • Fix server panic when calling system_mut (#18252)
  • Abort process if worker thread panics (#18211)
  • Gracefully handle salsa cancellations and panics in background request handlers (#18254)

Contributors

0.0.1-alpha.6

Server

  • Add rule link to server diagnostics (#18128)
  • Avoid panicking when there are multiple workspaces (#18151)
  • Show related information in diagnostic (#17359)

Configuration

  • Default src.root setting to ['.', '<project_name>'] if an src/ directory does not exist but a <project-name>/<project-name> directory does exist (#18141)

Typing semantics and features

  • Consider a class with a dynamic element in its MRO assignable to any subtype of type (#18205)
  • Ensure that a function-literal type is always considered equivalent to itself (#18227)
  • Promote literals when inferring class specializations from constructors (#18102)
  • Support typing.TypeAliasType (#18156)
  • Infer function-call type variables in both directions (#18155)

Improvements to modeling of runtime semantics

  • Integer indexing into bytes returns int (#18218)
  • Emit invalid-exception-caught diagnostics even when the caught exception is not bound to a variable (#18202)

Usability improvements

  • Add hint to some diagnostics that PEP 604 union syntax is only available on Python 3.10+ (#18192)
  • Add note to unresolved-import diagnostic hinting to users to configure their Python environment (#18207)
  • Make division-by-zero an opt-in diagnostic rather than opt-out (#18220)

Import resolution improvements

  • Add support for PyPy virtual environments (#18203)

Contributors

0.0.1-alpha.5

Bug fixes

  • Fix assignability checks for invariant generics parameterized by gradual types (#18138)
  • Revert boolean expression control flow change which caused a performance regression (#18150)
  • Remove pyvenv.cfg validation check for lines with multiple = (#18144)

Contributors

0.0.1-alpha.4

Enhancements

  • Allow unions including Any/Unknown as bases (#18094)
  • Better control flow for boolean expressions that are inside if (#18010)
  • Improve invalid method calls for unmatched overloads (#18122)
  • Add support for NamedTuple 'fallback' attributes (#18127)
  • type[…] is always assignable to type (#18121)
  • Support accessing __builtins__ global (#18118)

Bug fixes

  • Fix relative imports in stub packages (#18132)

Contributors

0.0.1-alpha.3

Enhancements

  • Include synthesized arguments in displayed counts for too-many-positional-arguments (#18098)

Bug fixes

  • Fix redundant-cast false positives when casting to Unknown (#18111)
  • Fix normalization of unions containing instances parameterized with unions (#18112)
  • Make dataclass instances adhere to DataclassInstance (#18115)

CLI

  • Change layout of extra verbose output and respect --color for verbose output (#18089)

Documentation

  • Use Cargo-style versions in the changelog (#397)

Contributors

0.0.1-alpha.2

Enhancements

  • Improve diagnostics for failure to call overloaded function (#18073)
  • Fix inconsistent casing in invalid-return-type diagnostic (#18084)
  • Add type-expression syntax link to invalid-type-expression diagnostics (#18104)

Bug fixes

  • Add cycle handling for unpacking targets (#18078)
  • Do not look up __init__ on instances (#18092)

Typing

  • Infer parameter specializations of explicitly implemented generic protocols (#18054)
  • Check assignments to implicit global symbols are assignable to the types declared on types.ModuleType (#18077)
  • Fix various generics-related TODOs (#18062)

Documentation

  • Fix rule link in the configuration description (#381)
  • Use https://ty.dev/rules when linking to the rules table (#18072)
  • Use ty server instead of ty lsp (#360)
  • Fix missing > in HTML anchor tags in CLI reference (#18096)
  • Fix link to rules docs (#378)
  • Fix repository in README transform script (#361)

Contributors

0.0.1-alpha.1

Enhancements

  • Add basic support for non-virtual Python environments (#17991)
  • Do not allow invalid virtual environments from discovered .venv or VIRTUAL_ENV (#18003)
  • Refine message for why a rule is enabled (#18038)
  • Update --python to accept paths to executables in environments (#17954)
  • Improve diagnostics for assert_type and assert_never (#18050)
  • Add a note to the diagnostic if a new builtin is used on an old Python version (#18068)

Bug fixes

  • Fix infinite recursion bug in is_disjoint_from (#18043)
  • Recognize submodules in self-referential imports (#18005)

Typing

  • Allow a class to inherit from an intersection if the intersection contains a dynamic type and the intersection is not disjoint from type (#18055)
  • Allow classes to inherit from type[Any] or type[Unknown] (#18060)
  • Apply function specialization to all overloads (#18020)
  • Implement DataClassInstance protocol for dataclasses (#18018)
  • Induct into instances and subclasses when finding and applying generics (#18052)
  • Infer parameter specializations of generic aliases (#18021)
  • Narrowing for hasattr() (#18053)
  • Silence false positives for PEP-695 ParamSpec annotations (#18001)
  • Understand homogeneous tuple annotations (#17998)
  • __file__ is always a string inside a Python module (#18071)

CLI

  • Avoid initializing progress bars early (#18049)

Contributors

0.0.0-alpha.8

Changes

  • Add --config CLI arg (#17697)
  • Add CLI documentation and update README (#284)
  • Add a warning about pre-release status to the CLI (#17983)
  • Add missing bitwise-operator branches for boolean and integer arithmetic (#17949)
  • Add progress bar for ty check (#17965)
  • Add CLI reference (#17978)
  • Change default severity for unbound-reference to error (#17936)
  • Change range of revealed-type diagnostic to be the range of the argument passed in, not the whole call (#17980)
  • Default to latest supported Python version (#17938)
  • Display "All checks passed!" message in green (#17982)
  • Document configuration schema (#17950)
  • Generate and add rules table (#17953)
  • Handle type variables that have other type variables as a default (#17956)
  • Ignore possibly-unresolved-reference by default (#17934)
  • Implement global handling and load-before-global-declaration syntax error (#17637)
  • Make unused-ignore-comment disabled by default for now (#17955)
  • Recognise functions containing yield from expressions as being generator functions (#17930)
  • Fix stack overflow on recursive protocols (#17929)
  • Report duplicate Protocol or Generic base classes with [duplicate-base], not [inconsistent-mro] (#17971)
  • Respect the gradual guarantee when reporting errors in resolving MROs (#17962)
  • Support typing.Self in methods (#17689)
  • Support extending __all__ from an imported module even when the module is not an ExprName node (#17947)
  • Support extending __all__ with a literal tuple or set as well as a literal list (#17948)
  • Understand classes that inherit from subscripted Protocol[] as generic (#17832)
  • Update ty metadata (#17943)
  • Add py.typed (#276)
  • Bottom-up improvement of diagnostic messages for union type function calls (#17984)
  • Fix more ecosystem/fuzzer panics with fixpoint (#17758)
  • Remove lint: prefix from top-level diagnostic preamble (#17987)

Contributors