Skip to content

[ty] Default-specialize class objects in meta-protocol checks - #28265

Merged
carljm merged 1 commit into
mainfrom
cjm/4269-meta-protocol-defaults
Sep 11, 2026
Merged

carljm merged 1 commit into
mainfrom
cjm/4269-meta-protocol-defaults

Conversation

@carljm

@carljm carljm commented Sep 3, 2026 •

Copy link
Copy Markdown
Contributor

Bare generic class objects were checked against type[P] using constructor return types that retained the class's type variables, even though ordinary class-member lookup already applies the default specialization. This could reject compatible classes and leak class-scoped type variables into generic protocol inference. In pyochain, those variables also trigger an expensive recursive protocol proof when passing bare Ok to and_then; this PR improves our overall type-check time for pyochain by ~8x.

Apply the default specialization when obtaining the constructed type for meta-protocol checking and inference, including inference from unions of class objects. A shared helper keeps those paths consistent. Explicit specializations, custom __new__ and metaclass __call__ return types, and all structural member checks are preserved. Ordinary constructor and callable inference are unchanged.

One of many PRs fixing problems uncovered by astral-sh/ty#4269.

Test plan

Added mdtests cover declared and missing type-parameter defaults, incompatible default specializations, explicit arguments, unions of bare classes, preservation of caller type variables, unbound methods, functools.partial, custom __new__ returns, and metaclass __call__ returns.

Local checks on all 115 tracked Python files in the unchanged pyochain checkout retain the same 514 diagnostics. A callable-inference control still infers Result[str, str] when passed bare Ok.

@carljm carljm added the ty The ty type checker label Sep 3, 2026
@astral-sh-bot

astral-sh-bot Bot commented Sep 3, 2026

Copy link
Copy Markdown

Typing conformance results

No changes detected ✅

Current numbers
The percentage of diagnostics emitted that were expected errors held steady at 97.84%. The percentage of expected errors that received a diagnostic held steady at 96.28%. The number of fully passing files held steady at 128/145.

@astral-sh-bot

astral-sh-bot Bot commented Sep 3, 2026

Copy link
Copy Markdown

Memory usage report

Memory usage unchanged ✅

@astral-sh-bot

astral-sh-bot Bot commented Sep 3, 2026

Copy link
Copy Markdown

ecosystem-analyzer results

No diagnostic changes detected ✅

Full report with detailed diff (timing results)

@carljm
carljm marked this pull request as ready for review September 3, 2026 00:52
@carljm
carljm requested a review from a team as a code owner September 3, 2026 00:52
@astral-sh-bot
astral-sh-bot Bot requested a review from ibraheemdev September 3, 2026 00:52

@ibraheemdev ibraheemdev left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice!

@carljm
carljm merged commit e11135d into main Sep 11, 2026
68 checks passed
@carljm
carljm deleted the cjm/4269-meta-protocol-defaults branch September 11, 2026 20:43
carljm added a commit that referenced this pull request Sep 14, 2026
…aliases

* origin/main: (21 commits)
  [ty] Share attribute write compatibility checks (#28555)
  [ty] Prefer `ty.toml` and `pyproject.toml` over playground `ty.json` (#28449)
  [`ruff`, `flake8-use-pathlib`] Support `parent_mode` (`RUF064`, `PTH103`) (#28528)
  [`pyupgrade`] Make the fix for `UP040` always unsafe (#28526)
  [`pyupgrade`] Skip `TypeVarTuple` and `ParamSpec` conversions with bounds or constraints (`UP040`, `UP046`, `UP047`) (#28505)
  [ty] Escape glob characters in anchored directory paths (#28518)
  [ty] Handle gradual metaclass ancestry and conflicts (#28474)
  [ty] Preserve recursive metadata in union transformations (#28497)
  [ty] Refactor "desperate" import resolution to use candidate operations that will also apply to module enumeration. (#28543)
  [ty] Report override conflicts introduced by new bases (#28530)
  [ty] Resolve dependencies within correlated inference alternatives (#28252)
  [ty] Extract shared abstract-method analysis (#28537)
  [ty] Reject reassignment of enum members (#28462)
  [ty] Preserve runtime comparison semantics when narrowing tagged unions (#28053)
  [ty] Extract a method on `NameResolver` to advance resolution by single module name component. (#28540)
  [ty] Return root discovery to `NameResolver`, but retain necessary interface changes (#28536)
  [ty] Default-specialize class objects in meta-protocol checks (#28265)
  [ty] Extract module root discovery from `NameResolver`. (#28531)
  [ty] Fix MRO ordering for generic bases (#28172)
  [ty] Run benchmarks for auto-imports in CI (#28490)
  ...

# Conflicts:
#	crates/ty_python_semantic/src/types/narrow.rs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ty The ty type checker

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants