parameter specification/type variable tuple variance - #2215
Conversation
5f8e0cc to
d9d82c9
Compare
81ba400 to
54ad5e1
Compare
JelleZijlstra
left a comment
There was a problem hiding this comment.
I like adding this if we can get it specified nicely, but this PR is not ready; the proposed test is incorrect.
Also, https://typing.python.org/en/latest/spec/generics.html#paramspec-variables still says variance on ParamSpec is unsupported; this should be updated.
I'd also like to see an implementation in at least one type checker, even if only as a draft PR, so we can be confident this is something that can be feasibly implemented.
|
I personally would also like to see tests added for param spec variance inference, since that would probably need to be supported as well. |
|
The test cases do have variance inference, though as I noted some of the cases are wrong. But it would probably be useful to have a few more cases, and I'd recommend putting the tests for paramspec variance in their own file so we can track type checker support more precisely. |
I have wip support in PyCharm, but I could also add it to basedpyright it was very straightforward to implement |
Oh right, sorry I didn't see them, because I thought they would be in a different file. I'm also very much +1 on putting those tests into a different file (for example |
8f30004 to
117964e
Compare
7a21592 to
5788125
Compare
|
support has landed in pycharm and cpython |
|
https://typing.python.org/en/latest/spec/generics.html#paramspec-variables stills says that we don't support variance in ParamSpec, that should be fixed in this PR. |
|
Also can you open an issue on python/typing-council asking for a formal pronouncement? |
5788125 to
f23d8ae
Compare
|
Noticed some more issues:
|
not |
414c697 to
02c4628
Compare
|
I don't think that's right. The form we want here should be a supertype of every other possible value, and something like a one-parameter callable is not a subtype of |
|
In ty we have a type that we spell as |
1d4ba59 to
424faf1
Compare
jorenham
left a comment
There was a problem hiding this comment.
The lack of co/contra variance for TypeVarTuples has caused problems for me on several occasions in the past. So thanks for patching this hole in the spec!
The changes to the variance algorithm also look like the way to go. It's too bad we don't have a general notion of the "top signature" like we do for the general top type (object) and the top product type (tuple[object, ...]). But I expect that the way you informally describe it here will be understood just fine by anyone that needs to know.
424faf1 to
37c324a
Compare
|
@carljm good to review now |
carljm
left a comment
There was a problem hiding this comment.
The direction here remains correct IMO, but I think there are some updates needed.
5e5e560 to
39c64a1
Compare
carljm
left a comment
There was a problem hiding this comment.
Thanks! Some things still need attention.
e24ce3c to
e0d06d5
Compare
carljm
left a comment
There was a problem hiding this comment.
CI says conformance results need updating; can you do that and then re-request review?
…should have variance
e0d06d5 to
5b4e853
Compare
carljm
left a comment
There was a problem hiding this comment.
Thank you! I pushed a few additional small changes (in separate commits so you can review each change if you like) -- this now looks good to me.
The most notable change is that I found three more places where the conformance suite used an implicitly-invariant ParamSpec in a location where it should be contravariant; thus a compliant checker should error on those uses, per the current spec / conformance suite. Fixing these involved a choice between unpalatable options:
- The most obvious fix is to make those ParamSpecs explicitly
contravariant=True, but this errors on four type checkers (mypy, pyright, zuban, pyrefly) which don't yet allow ParamSpecs to use that argument, making those type checkers fail on conformance tests that aren't really related to ParamSpec variance. - Another option is to define those ParamSpecs using PEP 695 syntax, which automatically opts into inferred variance, and allows those tests to stay focused on their core purpose. Unfortunately this seems to expose a crash in pycroscope.
I've gone with option (2) for now. @JelleZijlstra let me know if you are OK with landing this for now, would like to propose another alternative, or would like time to fix the pycroscope crash before we land this.
|
Let's land it, I think I need to do a round of fixing bugs in pycroscope :) |
discussion: https://discuss.python.org/t/parameter-specifications-should-have-variance/106452
typing.TypeVarTuplecpython#148212typing.TypeVarTuple: add bound/variance properties from 3.15 typeshed#15670 / Add Python 3.15 typing updates typeshed#15725