Avatar for the astral-sh user
astral-sh
ruff
Instrumentation
Wall Time
BlogDocsChangelog

Performance History

Latest Results

[ty] Prevent union builder construction for just one declaration
david/prevent-builder-construction
15 seconds ago
[ty] Infer nonlocal types as unions of all reachable bindings (#18750) ## Summary This PR includes a behavioral change to how we infer types for public uses of symbols within a module. Where we would previously use the type that a use at the end of the scope would see, we now consider all reachable bindings and union the results: ```py x = None def f(): reveal_type(x) # previously `Unknown | Literal[1]`, now `Unknown | None | Literal[1]` f() x = 1 f() ``` This helps especially in cases where the the end of the scope is not reachable: ```py def outer(x: int): def inner(): reveal_type(x) # previously `Unknown`, now `int` raise ValueError ``` This PR also proposes to skip the boundness analysis of public uses. This is consistent with the "all reachable bindings" strategy, because the implicit `x = <unbound>` binding is also always reachable, and we would have to emit "possibly-unresolved" diagnostics for every public use otherwise. Changing this behavior allows common use-cases like the following to type check without any errors: ```py def outer(flag: bool): if flag: x = 1 def inner(): print(x) # previously: possibly-unresolved-reference, now: no error ``` closes https://github.com/astral-sh/ty/issues/210 closes https://github.com/astral-sh/ty/issues/607 closes https://github.com/astral-sh/ty/issues/699 ## Follow up It is now possible to resolve the following TODO, but I would like to do that as a follow-up, because it requires some changes to how we treat implicit attribute assignments, which could result in ecosystem changes that I'd like to see separately. https://github.com/astral-sh/ruff/blob/315fb0f3da4e5f2097a294c344025dec28ebf2a5/crates/ty_python_semantic/src/semantic_index/builder.rs#L1095-L1117 ## Ecosystem analysis [**Full report**](https://shark.fish/diff-public-types.html) * This change obviously removes a lot of `possibly-unresolved-reference` diagnostics (7818) because we do not analyze boundness for public uses of symbols inside modules anymore. * As the primary goal here, this change also removes a lot of false-positive `unresolved-reference` diagnostics (231) in scenarios like this: ```py def _(flag: bool): if flag: x = 1 def inner(): x raise ``` * This change also introduces some new false positives for cases like: ```py def _(): x = None x = "test" def inner(): x.upper() # Attribute `upper` on type `Unknown | None | Literal["test"]` is possibly unbound ``` We have test cases for these situations and it's plausible that we can improve this in a follow-up. ## Test Plan New Markdown tests
main
6 minutes ago
Filter out overloads from bindings as well
david/public-types
27 minutes ago
Simplify side effect checks
LaBatata101:fix-F504
2 hours ago
Corrected errors, tests pass
lipefree:conflicting-declaration-attribute
2 hours ago
Error if active virtual env or conda env can't be resolved
micha/python-discovery-search-paths
4 hours ago

Active Branches

[ty] Prevent union builder construction for just one declaration
last run
15 seconds ago
#18954
CodSpeed Performance Gauge
N/A
#18953
CodSpeed Performance Gauge
0%
© 2025 CodSpeed Technology
Home Terms Privacy Docs