Pyrefly - A faster Python type checker written in Rust
62 comments
·April 29, 2025emptysea
A rewrite of https://github.com/facebook/pyre-check in rust?
team_pyrefly
Yes, this is a ground up rewrite: https://pyrefly.org/en/docs/pyrefly-faq/#what-is-the-relatio...
codethief
My thought exactly! Maybe for performance reasons? (Though I wouldn't expect OCaml to perform that badly, either…)
nine_k
On one hand, "launching Spring 2025". On the other hand, 47% complete, with a ton of basic stuff not yet ready. I wonder how fast they plan to move, given that only 32 days remain of the spring.
croemer
It's not "47% complete", it's just that (now) 52% of the issues in a milestone are complete.
rplnt
Not in southern hemisphere.
Vinz_
We’re 53 days away from summer though.
alexmolas
The astral team (behind uv and ruff) is already working on a type checker in Rust, and given the quality of their existing tools, I'm inclined to wait and see what they release. Pyrefly looks interesting, but from the repo it seems pretty early-stage and not intended for external use yet.
nemith
Also Facebook has a history of releasing the source code for something. Making a huge splash and then essentially doing nothing after 3 months (aka after someone gets their review).
They use the code internally but fail at making sure it has use externally. This is doubly the case for anything infrastructure
Buck2: Was released. Never could be built correctly without the latest nightly of Rust and even then it was fragile outside of Meta's build architecture
Sapling: Has a whole bunch of excitement and backing when it was announced. Has been essentially dead 3 mos after release.
I used to work for Meta infra. I know the MO. Have a hard time trusting.
Astral use-case is external and has a better chance of actually being supported.
team_pyrefly
We totally get why you might be skeptical and even address this in our FAQ: https://pyrefly.org/en/docs/pyrefly-faq/#how-do-i-know-this-...
We know we can't just ask for trust upfront. Instead, we want to earn it by showing up consistently and following through on our commitments. So, take us for a spin and see how we do over time. We're excited to prove ourselves!
ipsum2
Sapling is actively developed, not "dead after 3 months": https://github.com/facebook/sapling/commits/main/
Have not tried building Buck2 (no personal use for it), but its also actively developed: https://github.com/facebook/buck2/commits/main/
wocram
Is this standard promotion driven development? Or do the people who are trying to open source these products end up being blocked?
maxloh
It is codenamed "Red Knot".
Refer to the crates starting with red_knot in this directory to follow its development: https://github.com/astral-sh/ruff/tree/main/crates
The latest commit was only an hour ago.
jihadjihad
At first I thought this was the release from Astral for their type checker. Same boat, sitting tight, holding champagne ready for that day too.
lame-lexem
astral team has live web demo they use internally of redknot on https://playknot.ruff.rs
WD-42
Cannot wait to get rid of pyright, but I’ll be holding out for Astrals type checker.
nikisweeting
I've loved pyright so far, what do you dislike about it?
JimDabell
It has warnings that steer you away from idiomatic Python towards less idiomatic Python.
Idiomatic Python favours EAFP (Easier to Ask Forgiveness than Permission) over LBYL (Look Before You Leap), so you might write something like this when using TypedDicts:
try:
foo = bar["baz"]["qux"]
...
except KeyError:
...
Pyright warns you about this and pushes you to write this: if "baz" in bar and "qux" in bar["baz"]:
foo = bar["baz"]["qux"]
...
else:
...
They identified this as a bug and fixed it, then changed course and decided to reinstate the behaviour. So if you want to write idiomatic Python, you need to disable typechecking TypedDicts.— https://github.com/microsoft/pyright/issues/1739
Now if this were a linter then I would understand. But a type checker should not be opinionated to the point of pushing people not to use idiomatic Python.
NeutralForest
For maximum safety, I would write:
if bar.get("baz", {}).get("qux") is not None:
...
copperroof
When I last compared it to mypy a few months ago adding typechecking to an old project that had types but I had for some reason never actually run a typechecker on it:
* Was overwhelmingly slower than mypy
* Had a few hundred more false positives. I gather from reading their philosophy afterward that this was on purpose. Rigid dogma > doing the right thing in the circumstance in their opinion.
* Did not find any actual bugs, whereas mypy identified 3 errors that lead to fixing real issues AND had fewer false positives, due to its better understanding of python code.
* Comically overweight with its typescript dependency.
My first impression of it was of a very low quality, over engineered project prioritizing noise over signal. Looking forward to trying out the astral typechecker as well.
ndr
It's slow as hell. And every version bump comes with a bunch of new warnings/errors by default that is quite disruptive if you want to keep it quiet. But mostly that it is annoyingly slow.
emptysea
Might be worth checking out https://github.com/DetachHead/basedpyright
But I’ve had the same issue with too many warnings, mypy is better at understanding Python but even slower.
addoo
I guess it’s all relative. One of my code bases still has pylint running with only a couple custom lint rules, that one is slow as hell.
As for version bumping, maybe it’s just a me thing, but I hard fix a version and only update occasionally. Sure each update brings new warnings, but most of them are valid and if you only do it a couple times a year… not that big a deal.
WD-42
It’s dog slow. I realize we are talking about a python checker written in typescript, so two relatively slow languages combined, but still.
The dependency on node makes it a PITA to set up in non-vs code environments as well.
insane_dreamer
pyright doesn't do well with inspecting inherited types, at least in our experience. Falls far behind JetBrain's type checker in Pycharm. (This is one reason why pycharm >> zed.)
olejorgenb
Are you kidding? Pycharm's pychecker is very incomplete. My whole team moved away from pychram due to the shitty typehint support which barely moved forward. (5+ year old bug, inconsistent behavior across the different features in pycharm indicating to me a fragile mess of heuristics behind the curtains)
I agree that most of the functionality on top of the type checker/engine is better in pycharm though. But a correct implementation is more important
femtozer
The team behind ruff/uv is working on a similar tool:
joshdavham
Have there been any updates on when they think it’ll be released?
singhrac
At least the alpha milestone is May 12, but I don't think they've publically committed to anything.
In particular for me it would be great to have a better typechecker than Pyright available for Zed (basically why the editor is a nonstarter right now).
Y_Y
An editor is a nonstarter because it doesn't doesn't integrate the right implementation of some particular optional feature for some particular language?
That's a high bar!
WD-42
So what editor is a starter then? As far as I know pyright is the de facto checker for python in most editors. Not sure why it would be worse in zed, seems to work fine for me. Or as well as pyright can work.
null
koakuma-chan
> pyrefly check --suppress-errors
> INFO 5,240 errors shown, 65,932 errors ignored
Not a single Python type checker had ever worked for me so far.
kstrauser
I don't see the link between that output and your conclusion. Are those results wrong?
koakuma-chan
> Are those results wrong?
I don't know. Some packages just don't work with type checkers, e.g. Django.
masklinn
Django has a community stubs project, are you using it?
johnisgood
Is it not that he used the "--suppress-errors" flag yet it did not ignore the errors?
kstrauser
It's hard to tell. Other similar options in other commands can mean things like "exit with status 0 even if errors are detected". Without installing pyrefly, I'm not sure what that flag's supposed to do. It's not documented on their site.
team_pyrefly
Thanks for giving this a try! We go over how to use the upgrade tooling (`--suppress-errors`) in the guide here: https://pyrefly.org/en/docs/installation/. This is intended to make upgrading from different versions of type checkers easier. It’s something we use internally and wanted to share with the community along with the checker itself.
We also allow you the ability to suppress whole classes of errors if you want to ignore specific error types and avoid inline ignores: https://pyrefly.org/en/docs/configuration/ A word of caution: this will ignore future errors of this type as well.
First, make sure your project is properly configured and then follow the instructions. `--suppress-errors` will add ignores inline allowing the project to check cleanly. We have thought about a feature that allows you to keep suppressions in a separate file, but we have not put it on the roadmap yet. If this is something important for your workflow, we would like to learn more - please add a feature request on GitHub.
ipsum2
It's literally working? What did you expect?
koakuma-chan
Maybe it's working but it's not useful.
masklinn
What would you expect "useful" to be if your codebase is basically incompatible with type checking?
ForHackernews
Fix your types.
IshKebab
Do you... have type annotations? I think you might be missing the point.
jon-wood
I think the point here is that for something like Python the default behaviour should be an assumed return type of `Any` rather than throwing an error. Maybe that is the case and the GP had configured it otherwise.
IshKebab
No it shouldn't because then you can easily miss places where you should have added a type annotation, and also your lazy colleagues won't bother adding them at all.
Hi Hackernews, I’m on the team working on Pyrefly at Meta. We address a lot of the comments in our FAQ: https://pyrefly.org/en/docs/pyrefly-faq/. I will try to address some questions directly too!
Pyrefly is a work in progress, but you can install it from pypi and/or try our alpha VSCode extension if you are interested. You may still get false positive errors on your project as we are still burning down bugs and some features. We would love comments, bugs, or requests on our GitHub as you try it out.
Lastly, one of our team members is giving a talk at PyCon about the design if folks are interested: https://us.pycon.org/2025/schedule/presentation/118/. We didn’t expect much attention before then, so thanks for taking a look!