anyway if you want a python dependency manager not owned by openai, try pdm
@whitequark oh no, what did i miss :/
@imbl @whitequark Astral, the start-up behind uv and other Python tools, got aquired by OpenAI today. Now I'm kinda glad that I didn't invest too much time learning about uv ...

@fyrfaras @whitequark i just saw >:/

yay! im so excited to "sloppercharge my productivity" or whatever!!!

although i do love the irony that astral's repos use claude. really shows how full of shit they are when their announcement is sucking up to openai's codex but they're using a competitor's slop machine. definitely not just showing a complete lack of values lol

@imbl @fyrfaras @whitequark not a huge surprise sadly, anyone who’s used Python has seen this coming ever since the big data then the LLM researchers got interested in Python.
@Elizafox @imbl @fyrfaras astral's tools (fast typecheckers, etc) are also well-suited to the problem of "shove lots of garbage into the typechecker, see what sticks"; this isn't unique to astral (rust-analyzer is also good for it), astral just happened to accept a buyout at an opportune time

@whitequark @Elizafox @fyrfaras mmmmmm type-safe slop

ive used mypy enough to know that this is going to fail hilariously the first time it encounters wrong or poorly-typed interfaces >:3c

@imbl @Elizafox @fyrfaras i refuse to use mypy because mypy-flavored typing is a net negative to doing programming

@whitequark @Elizafox @fyrfaras fully agree. mypy sucks but its what i learned and its got all the plugins, plus i never got pyright working

i was actually planning on switching to ty for my next project  

@imbl @Elizafox @fyrfaras i'm using pylance, so the slop factor is the same as for ty
@whitequark @imbl @Elizafox I sea, could you please elaborate why mypy is a net negative for programming? ^_^
@fyrfaras @imbl @Elizafox it creates far too much busywork for the amount of bugs it finds. this has the added effect of giving python typing a bad reputation
@whitequark @fyrfaras @imbl I like mypy but I get some people prefer Python to be properly dynamically typed (that’s fine too).

@Elizafox @whitequark @imbl Alrighty, thank you for explaining it to me. ^^ Also I just read a toot thread, below, by @xgranade that mypy doesn't use “mathematical type checking” but rather “linting heuristics” which could lead to this bad reputation you've mentioned earlier I think.

https://wandering.shop/@xgranade/116259906731072162

Cassandra is only carbon now (@[email protected])

As I mentioned earlier, it's a bit more difficult to have good exit strategies with ruff, given that the specs around linting are much more loose. It's even harder to have a good exit strategy for ty, even though there's good specs, because there's not a great type checker to use instead¹. ___ ¹As has been pointed out to me, mypy is, for all its strengths and weaknesses, not a type checker. It doesn't follow formal mathematical type checking rules, it follows linting heuristics.

The Wandering Shop
@fyrfaras @Elizafox @whitequark @imbl Like, I'm not trying to be petty or sarcastic about it. Rather, it's that I think some of my earlier (and admittedly a bit toxic) hate of mypy came from deeply misunderstanding what mypy is and is trying to do. I would have expected from docs and the description, that mypy accepts well-typed programs and rejects programs that violate typing rules — but that's not it. It rejects well-typed programs that are likely incorrect, which is what a linter does.

@fyrfaras @Elizafox @whitequark @imbl In particular, I cannot predict the behavior of mypy given knowledge of Python's type system alone. I have to know about what is and is not likely a logic error in Python.

Which is fine if you want a somewhat more rigorous linter that has the benefit of being developed under the auspices of the PSF itself. But it's not what I want or would want out of a type checker.

@xgranade @fyrfaras @Elizafox @imbl so this makes sense but it is a profound failure of communication then that anyone calls mypy a typechecker

@whitequark @fyrfaras @Elizafox @imbl Agree, absolutely.

I made the mistake of thinking of it as one for a long time, but I have been disavowed of that notion.

@xgranade @fyrfaras @Elizafox @imbl however the problem is that the mypy website has this misinformation on the landing page

@whitequark @fyrfaras @Elizafox @imbl Ooof, yeah. Were I in the mood to start useless fights, I'd be tempted to PR a change to that page, but it'd just get people hurt for no reason.

I mean, it just isn't a type checker. That's not what it does.

@xgranade @fyrfaras @Elizafox @imbl well then I'm sure one of the people who like mypy here can fix it!

@whitequark I guess part of it is that I'm trying to reconcile "cool people that I think well of work on mypy" and "mypy is manifestly unfit to serve as the thing it advertises itself as." For me, that comes down to trying to understand what mypy *is* for if it's not the thing it's billed as, if there's some kind of semantic drift there.

Were I to make that PR as a frequently loud critic, I don't think it'd come across in good faith, and, well, fair enough.

@xgranade well. how to put it. I don't care how it's fixed, just that it is
@whitequark That's completely fair.
@xgranade @whitequark I'm still not really clear on why the incorrect simplifying assumptions about python's runtime that ty makes are just the practical compromises of a sound type checker but the incorrect simplifying assumptions that mypy makes put it in an entirely different category of software

@xgranade @whitequark like "too much busywork for the amount of bugs it finds" is not an experience I have had, but we write very different kinds of code so I'm definitely not arguing with that; I could see that 'ty' or 'pylance' might do far better with your code, or might even have a more rigorous approach to certain aspects of their type algebra. but all three happily give this program (and many like it) the thumbs-up:

x = 1
y = 2
locals()['y'] = 'oops'
print(x + y)

@glyph @xgranade i personally object to accepting too few programs, not too many
@glyph @xgranade there's a bunch of fine points about different programs but /bin/true to me is a valid and useful python typechecker in a way mypy isn't (and pylance is closer to /bin/true on this scale, in some configurations at least)

@whitequark @xgranade this is actually why I prefer mypy, specifically because (via plugins) it can accept an extension to the type system implemented with runtime hackery, and handle Zope Interface, while none of the other ones can. pydantic also has a similar thing (and dataclasses were originally supported via the 'attrs' plugin, although everybody else eventually got on board with those).

but I guess when it comes to "helpful" warnings, mypy probably does produce a lot more of those

@glyph @xgranade i need this (pluggability) for amaranth... but because using mypy makes me miserable amaranth is simply incompatible with every typechecker instead
@whitequark @xgranade in any case, I absolutely understand “the experience of using this sucks”, I just don’t get the category distinction
@glyph maybe it doesn't exist, i took @xgranade at her word
@whitequark @glyph Sorry, was on a StS2 run, heh. Anyway, my understanding of the difference is that sometimes, when you report a false negative in mypy (that is, a program being rejected despite being well-typed), the response is "well, don't write that program." I struggle to put into words how off the mark that is for a type checker, but it's perfectly sensible for a linter.

@xgranade @glyph a type-checker that rejects well-typed programs is by definition buggy. if it's not fixed then it is unfit for purpose

we could have a broader discussion of what "well-typed" means for Python (it is not clear to me at all) but if the above is an accurate assessment of the consensus in mypy development then it is not a(n even aspirationally correct) type-checker

@whitequark That's what I'm getting at, yeah. For a piece of software to be a type checker, there should not be a single case *ever* of a well-typed program that is rejected *by design*.
@xgranade @whitequark do you have a canonical example of such a WONTFIX?

@glyph @whitequark

```
def f() -> None:
return

y = f()
```

main.py:4: error: "f" does not return a value (it only ever returns None) [func-returns-value]
Found 1 error in 1 file (checked 1 source file)

@glyph @whitequark That program is well-typed by the documented rules. In fact it passes if I add a type parameter!

```
def f(x: None) -> None:
return x

def g[T](x: T) -> T:
return x

y = f(None) # errors
z = g(None) # passes
```

There's no underlying mathematical framework for that, it's "hey, we noticed that if you set y = f() and f can only return None, you probably did something wrong." Which is correct, I agree with that! But it's not a type checking failure.

@glyph @whitequark Perhaps even more stark is that the same thing happens even when I tell mypy *explicitly* that something can only return None, but I do so in two different ways.

```
class C:
def f(self, x: None) -> None:
return x

class D[T]:
def f(self, x: T) -> T:
return x

c = C()
y = c.f(None) # errors

d = D[None]()
z = d.f(None) # passes
```

That fails to be coherent under substitution of type parameters.