<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Python Developer Tooling Handbook – Type Checking</title>
    <link>https://pydevtools.com/handbook/topics/type-checking/</link>
    <description>mypy, ty, pyright, gradual typing, and the Python type-checking ecosystem.</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Fri, 08 May 2026 03:19:33 -0400</lastBuildDate>
    
	  <atom:link href="https://pydevtools.com/handbook/topics/type-checking/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>ty: A Complete Guide to Python&#39;s Fastest Type Checker</title>
      <link>https://pydevtools.com/handbook/explanation/ty-complete-guide/</link>
      <pubDate>Fri, 15 May 2026 11:47:17 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/ty-complete-guide/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt; is a Python type checker and language server built by Astral, the team behind &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;Ruff&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;. It checks Python code for type errors an order of magnitude faster than &lt;a href=&#34;https://pydevtools.com/handbook/reference/mypy/&#34;&gt;mypy&lt;/a&gt;. The same binary that runs &lt;code&gt;ty check&lt;/code&gt; in CI also serves as a full language server, powering editor features like completions and go-to-definition.&lt;/p&gt;
&lt;h2&gt;Why ty exists&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;why-ty-exists&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#why-ty-exists&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ty&amp;rsquo;s &lt;strong&gt;gradual guarantee&lt;/strong&gt; makes incremental type adoption safe: adding annotations to your code will never introduce new errors. You can annotate a function&amp;rsquo;s return type and ty won&amp;rsquo;t flag callers that were already passing the wrong type just because the annotation appeared. Each annotation only narrows existing errors rather than creating new ones.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Basedpyright: Python Type Checker (pyright Fork)</title>
      <link>https://pydevtools.com/handbook/reference/basedpyright/</link>
      <pubDate>Fri, 15 May 2026 11:47:17 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/reference/basedpyright/</guid>
      <description>&lt;p&gt;Basedpyright is a static type checker and language server for Python, maintained by DetachHead as a community fork of Microsoft&amp;rsquo;s &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyright/&#34;&gt;pyright&lt;/a&gt;. It tracks upstream pyright closely and adds diagnostic rules, stricter defaults, and language-server features that Microsoft keeps exclusive to its closed-source Pylance extension.&lt;/p&gt;
&lt;p&gt;The fork exists because pyright ships as an npm package and depends on Node.js, which makes it awkward to pin as a project dependency, and because the editor features most Python developers associate with &amp;ldquo;pyright&amp;rdquo; actually live in Pylance, whose license restricts it to official Microsoft VS Code builds. Basedpyright packages the language server on &lt;a href=&#34;https://pypi.org/project/basedpyright/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PyPI&lt;/a&gt; so &lt;code&gt;uv add --dev basedpyright&lt;/code&gt; works, and re-implements Pylance-style features (inlay hints, semantic highlighting, docstring completion) in the open-source server so VS Code forks like Cursor, VSCodium, and Positron can use them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How do Python type checkers compare?</title>
      <link>https://pydevtools.com/handbook/explanation/how-do-mypy-pyright-and-ty-compare/</link>
      <pubDate>Fri, 15 May 2026 22:53:52 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/how-do-mypy-pyright-and-ty-compare/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/mypy/&#34;&gt;mypy&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyright/&#34;&gt;pyright&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyrefly/&#34;&gt;Pyrefly&lt;/a&gt;, &lt;a href=&#34;https://pydevtools.com/handbook/reference/basedpyright/&#34;&gt;Basedpyright&lt;/a&gt;, and &lt;a href=&#34;https://pydevtools.com/handbook/reference/zuban/&#34;&gt;Zuban&lt;/a&gt; all analyze type annotations to catch bugs before runtime. They read the same type-hint annotations (from &lt;a href=&#34;https://peps.python.org/pep-0484/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PEP 484&lt;/a&gt;, the standard that introduced Python&amp;rsquo;s type system in 2014) and largely agree on the parts of the spec a working program uses. They disagree on speed, default strictness, treatment of unannotated code, editor integration, and licensing, and those disagreements are what make the choice matter.&lt;/p&gt;
&lt;p&gt;The handbook recommends &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyrefly/&#34;&gt;Pyrefly&lt;/a&gt; (Meta) as the default for new projects. See &lt;a href=&#34;#when-to-choose-each&#34;&gt;When to choose each&lt;/a&gt; for the rationale and the cases where a different checker fits better.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to add type annotations to a Python project with pyrefly infer</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-add-type-annotations-with-pyrefly-infer/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-add-type-annotations-with-pyrefly-infer/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/pyrefly/&#34;&gt;Pyrefly&lt;/a&gt; can turn &lt;code&gt;def total(numbers):&lt;/code&gt; into &lt;code&gt;def total(numbers: list[int]) -&amp;gt; int:&lt;/code&gt; without running your code. The command is &lt;code&gt;pyrefly infer&lt;/code&gt;, previously called &lt;code&gt;autotype&lt;/code&gt;, and it writes draft annotations by reading call sites with static analysis.&lt;/p&gt;
&lt;p&gt;For a legacy codebase with thousands of unannotated functions, this turns weeks of manual annotation into a reviewable diff. The output needs a human review pass before merging.&lt;/p&gt;
&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200&#34;&gt;
  &lt;p class=&#34;hx:flex hx:items-center hx:font-medium&#34;&gt;&lt;svg height=16px class=&#34;hx:inline-block hx:align-middle hx:mr-2&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z&#34;/&gt;&lt;/svg&gt;Note&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to configure Claude Code with a Python type checker</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-configure-claude-code-with-a-python-type-checker/</link>
      <pubDate>Fri, 15 May 2026 21:28:17 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-configure-claude-code-with-a-python-type-checker/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://code.claude.com/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Claude Code&lt;/a&gt; does not run a Python type checker by default, and the gap is wider than it looks. Listing &lt;code&gt;uv run ty check&lt;/code&gt; in &lt;code&gt;CLAUDE.md&lt;/code&gt; looks like enough configuration, but &lt;a href=&#34;https://pyrefly.org/blog/pyrefly-agentic-loop/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Pyrefly&amp;rsquo;s documented agentic-loop pattern&lt;/a&gt; shows that models routinely skip the command unless the type checker is wrapped in a loop that runs after every edit. With the wrapper in place, the model engages with errors; without it, the model treats the checker as optional.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to configure mypy and django-stubs in a uv project</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-configure-mypy-and-django-stubs-in-a-uv-project/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-configure-mypy-and-django-stubs-in-a-uv-project/</guid>
      <description>&lt;p&gt;Run &lt;a href=&#34;https://pydevtools.com/handbook/reference/mypy/&#34;&gt;mypy&lt;/a&gt; on a Django project without &lt;code&gt;django-stubs&lt;/code&gt; and the first error is &lt;code&gt;Need type annotation for &amp;quot;name&amp;quot;&lt;/code&gt; on every model field. mypy cannot infer that &lt;code&gt;models.CharField(max_length=200)&lt;/code&gt; resolves to &lt;code&gt;str&lt;/code&gt; or that &lt;code&gt;Question.objects.filter()&lt;/code&gt; returns a &lt;code&gt;QuerySet[Question]&lt;/code&gt;. The &lt;code&gt;django-stubs&lt;/code&gt; package and its bundled mypy plugin fill those gaps.&lt;/p&gt;
&lt;p&gt;This guide installs both with &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; and configures everything from a single &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyproject.toml/&#34;&gt;&lt;code&gt;pyproject.toml&lt;/code&gt;&lt;/a&gt;, with an override pattern for adopting type checking gradually on a legacy Django codebase.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to configure mypy strict mode</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-configure-mypy-strict-mode/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-configure-mypy-strict-mode/</guid>
      <description>&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-200&#34;&gt;
  &lt;div class=&#34;hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2&#34;&gt;&lt;svg height=1.2em class=&#34;hx:inline-block hx:align-middle&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;

  &lt;div class=&#34;hx:w-full hx:min-w-0 hx:leading-7&#34;&gt;
    &lt;div class=&#34;hx:mt-6 hx:leading-7 hx:first:mt-0&#34;&gt;This guide assumes you have a Python project set up with &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/mypy/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;mypy&lt;/a&gt; installed as a dev dependency.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Running &lt;code&gt;mypy&lt;/code&gt; with default settings is lenient. It skips function bodies that lack type annotations and ignores several categories of type errors. Strict mode closes these gaps by requiring annotations on all functions and enabling a curated set of optional checks. The exact flags included in &lt;code&gt;--strict&lt;/code&gt; may change between mypy releases.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to gradually adopt type checking in an existing Python project</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-gradually-adopt-type-checking-in-an-existing-python-project/</link>
      <pubDate>Sat, 16 May 2026 06:16:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-gradually-adopt-type-checking-in-an-existing-python-project/</guid>
      <description>&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-200&#34;&gt;
  &lt;div class=&#34;hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2&#34;&gt;&lt;svg height=1.2em class=&#34;hx:inline-block hx:align-middle&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;

  &lt;div class=&#34;hx:w-full hx:min-w-0 hx:leading-7&#34;&gt;
    &lt;div class=&#34;hx:mt-6 hx:leading-7 hx:first:mt-0&#34;&gt;This guide assumes you have a Python project managed by &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;uv&lt;/a&gt;. If you haven&amp;rsquo;t created a project yet, see the &lt;a href=&#34;https://pydevtools.com/handbook/tutorial/create-your-first-python-project/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;project creation tutorial&lt;/a&gt; before proceeding.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Running a type checker on an established codebase for the first time produces hundreds or thousands of errors. That wall of red discourages adoption before it starts. The practical path is to check new code strictly while ignoring legacy issues, then shrink the ignore list over time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to migrate from mypy to Pyrefly</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-migrate-from-mypy-to-pyrefly/</link>
      <pubDate>Wed, 13 May 2026 18:09:04 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-migrate-from-mypy-to-pyrefly/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/pyrefly/&#34;&gt;Pyrefly&lt;/a&gt; 1.0 ships an auto-migration tool that reads an existing &lt;a href=&#34;https://pydevtools.com/handbook/reference/mypy/&#34;&gt;mypy&lt;/a&gt; config and writes the equivalent Pyrefly configuration. The mechanical translation is one command. The diagnostic triage that follows is the real work, and Pyrefly&amp;rsquo;s incremental-adoption tooling makes it possible to do that work without blocking CI.&lt;/p&gt;
&lt;p&gt;This guide walks through both halves using &lt;a href=&#34;https://github.com/pre-commit/pre-commit&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pre-commit&lt;/a&gt; as a real example.&lt;/p&gt;
&lt;h2&gt;Confirm your mypy config location&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;confirm-your-mypy-config-location&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#confirm-your-mypy-config-location&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;pyrefly init&lt;/code&gt; reads two file formats:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to migrate from mypy to ty</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-migrate-from-mypy-to-ty/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-migrate-from-mypy-to-ty/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt; is a fast Python type checker, developed by &lt;a href=&#34;https://astral.sh/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Astral&lt;/a&gt; (the creators of &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;Ruff&lt;/a&gt;). It runs faster than &lt;a href=&#34;https://pydevtools.com/handbook/reference/mypy/&#34;&gt;mypy&lt;/a&gt;, especially on large codebases.&lt;/p&gt;
&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-200&#34;&gt;
  &lt;div class=&#34;hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2&#34;&gt;&lt;svg height=1.2em class=&#34;hx:inline-block hx:align-middle&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;

  &lt;div class=&#34;hx:w-full hx:min-w-0 hx:leading-7&#34;&gt;
    &lt;div class=&#34;hx:mt-6 hx:leading-7 hx:first:mt-0&#34;&gt;ty is currently in beta. While actively developed, it&amp;rsquo;s still missing some features and may not be ready for full production adoption. This guide helps evaluate readiness and plan for migration.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;Understanding ty&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;understanding-ty&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#understanding-ty&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;When to consider migrating&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;when-to-consider-migrating&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#when-to-consider-migrating&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Projects needing faster type checking on large codebases&lt;/li&gt;
&lt;li&gt;Teams already using other Astral tools (Ruff, uv)&lt;/li&gt;
&lt;li&gt;Projects not relying on mypy plugins&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;When to wait&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;when-to-wait&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#when-to-wait&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Projects requiring Pydantic, Django, or SQLAlchemy mypy plugins&lt;/li&gt;
&lt;li&gt;Projects requiring mature, battle-tested tooling&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Installation and basic usage&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;installation-and-basic-usage&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#installation-and-basic-usage&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Installing ty&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;installing-ty&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#installing-ty&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ty is distributed as a standalone binary. The easiest way to use it is via &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uvx&lt;/a&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to migrate from pyright to ty</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-migrate-from-pyright-to-ty/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-migrate-from-pyright-to-ty/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt; is a Python type checker developed by &lt;a href=&#34;https://astral.sh/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Astral&lt;/a&gt; (the creators of &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;Ruff&lt;/a&gt;). It ships as a single binary with no runtime dependencies, which eliminates &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyright/&#34;&gt;pyright&lt;/a&gt;&amp;rsquo;s Node.js requirement.&lt;/p&gt;
&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-200&#34;&gt;
  &lt;div class=&#34;hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2&#34;&gt;&lt;svg height=1.2em class=&#34;hx:inline-block hx:align-middle&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;

  &lt;div class=&#34;hx:w-full hx:min-w-0 hx:leading-7&#34;&gt;
    &lt;div class=&#34;hx:mt-6 hx:leading-7 hx:first:mt-0&#34;&gt;ty is currently in beta. While actively developed, it&amp;rsquo;s still missing some features and may not be ready for full production adoption. This guide helps evaluate readiness and plan for migration.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;Understanding ty&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;understanding-ty&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#understanding-ty&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;When to consider migrating&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;when-to-consider-migrating&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#when-to-consider-migrating&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Projects wanting faster type checking on large codebases&lt;/li&gt;
&lt;li&gt;Teams already using other Astral tools (Ruff, uv)&lt;/li&gt;
&lt;li&gt;Projects wanting to eliminate Node.js dependency&lt;/li&gt;
&lt;li&gt;Projects without complex platform-specific dependencies lacking stubs&lt;/li&gt;
&lt;li&gt;Projects with simple pyright configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;When to wait&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;when-to-wait&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#when-to-wait&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Projects heavily dependent on pyright-specific features like &lt;code&gt;--verifytypes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Projects requiring &lt;code&gt;typeCheckingMode&lt;/code&gt; presets (until ty adds equivalents)&lt;/li&gt;
&lt;li&gt;Projects with complex platform-specific dependencies lacking stubs&lt;/li&gt;
&lt;li&gt;Projects where pyright&amp;rsquo;s specific type inference is depended upon&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Installation and basic usage&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;installation-and-basic-usage&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#installation-and-basic-usage&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Installing ty&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;installing-ty&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#installing-ty&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ty is distributed as a standalone binary. The easiest way to use it is via &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uvx&lt;/a&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to try the ty type checker</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-try-the-ty-type-checker/</link>
      <pubDate>Sat, 16 May 2026 06:16:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-try-the-ty-type-checker/</guid>
      <description>&lt;p&gt;This guide shows you how to try out &lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt;, a static type checker and language server, in your project.&lt;/p&gt;
&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200&#34;&gt;
  &lt;div class=&#34;hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2&#34;&gt;&lt;svg height=1.2em class=&#34;hx:inline-block hx:align-middle&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;

  &lt;div class=&#34;hx:w-full hx:min-w-0 hx:leading-7&#34;&gt;
    &lt;div class=&#34;hx:mt-6 hx:leading-7 hx:first:mt-0&#34;&gt;Looking to migrate from &lt;a href=&#34;https://pydevtools.com/handbook/reference/mypy/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;mypy&lt;/a&gt; to ty? See &lt;a href=&#34;https://pydevtools.com/handbook/how-to/how-to-migrate-from-mypy-to-ty/&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;How to migrate from mypy to ty&lt;/a&gt; for detailed guidance.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;Prerequisites&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;prerequisites&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#prerequisites&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To proceed, you&amp;rsquo;ll need &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to use ty in CI</title>
      <link>https://pydevtools.com/handbook/how-to/how-to-use-ty-in-ci/</link>
      <pubDate>Wed, 13 May 2026 06:43:22 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/how-to/how-to-use-ty-in-ci/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt; can run in CI with no installation step beyond &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;. Because ty is a single binary with no runtime dependencies, it adds minimal overhead to your pipeline.&lt;/p&gt;
&lt;h2&gt;GitHub Actions&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;github-actions&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#github-actions&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The simplest approach uses &lt;code&gt;uvx&lt;/code&gt; to run ty without adding it as a project dependency:&lt;/p&gt;
&lt;div class=&#34;hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code&#34;&gt;

&lt;div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- &lt;span class=&#34;nt&#34;&gt;uses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;actions/checkout@v4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;uses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;astral-sh/setup-uv@v7&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;uvx ty check src/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;hextra-code-copy-btn-container  hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0&#34;&gt;
  &lt;button
    class=&#34;hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50&#34;
    title=&#34;Copy code&#34;
    aria-label=&#34;Copy code&#34;
    data-copied-label=&#34;Copied!&#34;
  &gt;
    &lt;div class=&#34;hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
&lt;div class=&#34;hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To get inline annotations on pull requests, use the &lt;code&gt;github&lt;/code&gt; output format:&lt;/p&gt;</description>
    </item>
    <item>
      <title>mypy: Python Static Type Checker</title>
      <link>https://pydevtools.com/handbook/reference/mypy/</link>
      <pubDate>Sat, 16 May 2026 07:30:29 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/reference/mypy/</guid>
      <description>&lt;p&gt;mypy is a static type checker for Python that analyzes type annotations to detect bugs before runtime. It has been the default Python type checker since 2012 and has the broadest ecosystem support of any Python type checking tool.&lt;/p&gt;
&lt;h2&gt;When to use mypy&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;when-to-use-mypy&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#when-to-use-mypy&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Use mypy when you want to catch type-related bugs before runtime by adding static type checking to a Python project. It is the most established Python type checker with broad ecosystem support, making it a reliable default for projects that are adopting type annotations incrementally. For faster checking or tighter VS Code integration, consider &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyright/&#34;&gt;pyright&lt;/a&gt;; for an emerging alternative from the creators of &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;Ruff&lt;/a&gt;, see &lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>pylint: Python Static Code Analyzer</title>
      <link>https://pydevtools.com/handbook/reference/pylint/</link>
      <pubDate>Mon, 11 May 2026 06:30:40 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/reference/pylint/</guid>
      <description>&lt;p&gt;Pylint is a static analysis tool for Python. It parses source code without executing it and reports coding-standard violations, suspicious constructs, and design-level issues such as overly complex functions and duplicate code blocks.&lt;/p&gt;
&lt;h2&gt;When to use pylint&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;when-to-use-pylint&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#when-to-use-pylint&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pylint suits codebases that already depend on its semantic checks: duplicate-code detection across modules and design-rule enforcement that style-focused linters do not cover. Teams with an established &lt;code&gt;.pylintrc&lt;/code&gt; and a CI pipeline tuned around its output keep a familiar tool backed by a long-running plugin ecosystem.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pyrefly: Python Type Checker by Meta</title>
      <link>https://pydevtools.com/handbook/reference/pyrefly/</link>
      <pubDate>Sat, 16 May 2026 07:30:29 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/reference/pyrefly/</guid>
      <description>&lt;p&gt;Pyrefly is a static type checker and language server for Python, developed by Meta. It performs static analysis on Python code to identify type-related issues before runtime and provides IDE features like code navigation, autocompletion, and semantic highlighting.&lt;/p&gt;
&lt;p&gt;Pyrefly is a clean-slate implementation inspired by Meta&amp;rsquo;s earlier &lt;a href=&#34;https://pyre-check.org&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Pyre&lt;/a&gt; type checker. It uses a new type inference engine, a custom incremental computation model, and multi-threaded parallel checking.&lt;/p&gt;
&lt;h2&gt;When to use Pyrefly&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;when-to-use-pyrefly&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#when-to-use-pyrefly&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pyrefly is the handbook&amp;rsquo;s recommended type checker for new Python projects. It reached stable 1.0.0 in May 2026, runs 10-50x faster than &lt;a href=&#34;https://pydevtools.com/handbook/reference/mypy/&#34;&gt;mypy&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyright/&#34;&gt;pyright&lt;/a&gt; on large codebases, scores higher than &lt;a href=&#34;https://pydevtools.com/handbook/reference/ty/&#34;&gt;ty&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/mypy/&#34;&gt;mypy&lt;/a&gt; on the typing-spec conformance suite (over 90% per the &lt;a href=&#34;https://github.com/facebook/pyrefly/releases/tag/1.0.0&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;1.0.0 release notes&lt;/a&gt;; see the &lt;a href=&#34;https://htmlpreview.github.io/?https://github.com/python/typing/blob/main/conformance/results/results.html&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Python typing conformance dashboard&lt;/a&gt; for live numbers), and ships first-party documentation for AI-agent workflows (skill files and Stop-event hooks). It checks aggressively, catching errors in unannotated code that mypy skips by default. Meta deploys Pyrefly on Instagram (~20M LOC), with adoption at PyTorch and JAX.&lt;/p&gt;</description>
    </item>
    <item>
      <title>pyright: Python Static Type Checker by Microsoft</title>
      <link>https://pydevtools.com/handbook/reference/pyright/</link>
      <pubDate>Sat, 16 May 2026 07:30:29 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/reference/pyright/</guid>
      <description>&lt;p&gt;pyright is a static type checker and language server for Python, built and maintained by Microsoft. It analyzes type annotations to detect bugs before runtime and provides editor features like autocompletion, hover information, and go-to-definition.&lt;/p&gt;
&lt;p&gt;pyright powers the &lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Pylance extension&lt;/a&gt; for Visual Studio Code. Pylance is closed-source and adds features on top of pyright&amp;rsquo;s open-source language server, but pyright itself can be used with any editor that supports LSP.&lt;/p&gt;
&lt;h2&gt;When to use pyright&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;when-to-use-pyright&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#when-to-use-pyright&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;pyright is a strong choice for teams that want real-time type feedback in their editor, especially in VS Code through the Pylance extension. Its aggressive type inference catches bugs in unannotated code that &lt;a href=&#34;https://pydevtools.com/handbook/reference/mypy/&#34;&gt;mypy&lt;/a&gt; would skip by default.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ty: Python Type Checker by Astral</title>
      <link>https://pydevtools.com/handbook/reference/ty/</link>
      <pubDate>Sat, 16 May 2026 07:30:29 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/reference/ty/</guid>
      <description>&lt;p&gt;ty (pronounced &lt;em&gt;tee-why&lt;/em&gt;) is a static type checker and language server for Python from Astral (creators of &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;Ruff&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt;). It performs static analysis on Python code to identify type-related issues before runtime.&lt;/p&gt;
&lt;div class=&#34;hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200&#34;&gt;
  &lt;div class=&#34;hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2&#34;&gt;&lt;svg height=1.2em class=&#34;hx:inline-block hx:align-middle&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; fill=&#34;none&#34; viewBox=&#34;0 0 24 24&#34; stroke-width=&#34;2&#34; stroke=&#34;currentColor&#34; aria-hidden=&#34;true&#34;&gt;&lt;path stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34; d=&#34;M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z&#34;/&gt;&lt;/svg&gt;&lt;/div&gt;

  &lt;div class=&#34;hx:w-full hx:min-w-0 hx:leading-7&#34;&gt;
    &lt;div class=&#34;hx:mt-6 hx:leading-7 hx:first:mt-0&#34;&gt;ty was initially known by the code name &amp;ldquo;Red-Knot&amp;rdquo; during its early development phase. The tool is in beta, with a stable 1.0 release targeted for 2026.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;When to use ty&lt;span class=&#34;hx:absolute hx:-mt-20&#34; id=&#34;when-to-use-ty&#34;&gt;&lt;/span&gt;
    &lt;a href=&#34;#when-to-use-ty&#34; class=&#34;subheading-anchor&#34; aria-label=&#34;Permalink for this section&#34;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ty is an alternative to the handbook&amp;rsquo;s recommended type checker, &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyrefly/&#34;&gt;Pyrefly&lt;/a&gt;. Its &amp;ldquo;gradual guarantee&amp;rdquo; ensures that adding type annotations to working code never introduces new errors, which makes incremental adoption predictable in a partially-typed codebase. ty also runs 10-100x faster than &lt;a href=&#34;https://pydevtools.com/handbook/reference/mypy/&#34;&gt;mypy&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/pyright/&#34;&gt;pyright&lt;/a&gt; and pairs cleanly with &lt;a href=&#34;https://pydevtools.com/handbook/reference/ruff/&#34;&gt;Ruff&lt;/a&gt; and &lt;a href=&#34;https://pydevtools.com/handbook/reference/uv/&#34;&gt;uv&lt;/a&gt; in the Astral toolchain. Pyrefly is recommended over ty for most new projects because ty is still in beta as of 2026 and its typing-spec conformance trails Pyrefly&amp;rsquo;s; choose ty if the gradual guarantee matters more than feature completeness, or if Astral-toolchain coherence is a priority. For a full comparison across all major type checkers, see &lt;a href=&#34;https://pydevtools.com/handbook/explanation/how-do-mypy-pyright-and-ty-compare/&#34;&gt;How do Python type checkers compare?&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What is a Python language server?</title>
      <link>https://pydevtools.com/handbook/explanation/what-is-a-python-language-server/</link>
      <pubDate>Tue, 05 May 2026 06:56:59 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/explanation/what-is-a-python-language-server/</guid>
      <description>&lt;p&gt;Type a dot after a variable in your editor and a list of methods appears. Hover a function and its signature shows up in a tooltip. Right-click an import and &amp;ldquo;Go to definition&amp;rdquo; jumps to the source. Most Python developers have used these features for years without knowing the name of the program behind them.&lt;/p&gt;
&lt;p&gt;That program is a &lt;strong&gt;language server&lt;/strong&gt;. It is a separate process running alongside your editor, and it is doing most of the work readers usually credit to &amp;ldquo;the editor.&amp;rdquo; Naming it explains why VS Code, Neovim, Cursor, and Zed give you the same autocomplete on the same file, and why a faster type checker makes your editor feel faster.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Zuban: Mypy-Compatible Python Type Checker</title>
      <link>https://pydevtools.com/handbook/reference/zuban/</link>
      <pubDate>Fri, 15 May 2026 21:28:17 -0400</pubDate>
      <author>Tim Hopper</author>
      <guid>https://pydevtools.com/handbook/reference/zuban/</guid>
      <description>&lt;p&gt;Zuban is a static type checker and language server for Python, written in Rust by David Halter, author of &lt;a href=&#34;https://github.com/davidhalter/jedi&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Jedi&lt;/a&gt; (the longstanding Python autocompletion library) and &lt;a href=&#34;https://github.com/davidhalter/parso&#34;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;parso&lt;/a&gt;. It runs in two modes: &lt;code&gt;zuban mypy&lt;/code&gt; (aliased as &lt;code&gt;zmypy&lt;/code&gt;) behaves as a mypy-compatible drop-in, and &lt;code&gt;zuban check&lt;/code&gt; applies a pyright-style inference strategy.&lt;/p&gt;
&lt;p&gt;Zuban launched as open source under AGPL-3.0 in September 2025, with a paid commercial license available for organizations that cannot accept AGPL&amp;rsquo;s source-disclosure requirements. That licensing split is what most distinguishes Zuban from its competitors: it funds full-time development in a way that MIT-licensed alternatives cannot, but it also rules Zuban out for many proprietary codebases unless the team buys a commercial license.&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
