You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
property[GetType, SetType] is required for us to remove a lot of special casing from type-checkers and just use the primitive type
In runtime it copies the same behavior list / dict / other primitive types have under PEP-585
Open questions:
I think that it is too late to backport this in 3.10. Am I right?
I hope that from __future__ import annotations will just work for this new change. Is there anything I should do in scope of this PR? Is my assumption about __future__ import is even correct in this context? Do I need to test that it works with __future__ annotations?
Yes, it is too late for 3.10 (but you can add it to typing_extensions). Also, PEP-585 is done, we don't update PEPs. Please do test with from __future__ import annotations -- you never know.
When this was first proposed (python/typing#985) there were worries about backwards compatibility. Given how common property is, we need to make sure there are no problems with that. Can you address that? I don't see it in the original thread.
Also, since this requires type checkers to change, do we need a PEP?
Finally. Please keep discussion in this bpo issue, don't have long discussions on the PR. (Honestly I think it's too soon for a PR given that we don't seem to have agreement in the typing tracker discussion.)
Yes, it is too late for 3.10 (but you can add it to typing_extensions). Also, PEP-585 is done, we don't update PEPs.
Got it!
Please do test with from __future__ import annotations -- you never know.
Done, PR is updated. Now we test that property works with future import.
When this was first proposed (python/typing#985) there were worries about backwards compatibility. Given how common property is, we need to make sure there are no problems with that. Can you address that? I don't see it in the original thread.
Here's a list of problem from the original thread:
## the returned value of property has no typing equivalent
Now there is: property[G, S]
## There is no consistency in how properties in classes work in comparison to normal variables or functions
Author points out that all python versions right now ignore propertys when get_type_hints() is used. There's nothing we can do here: it is not related to propertys being generic in any way.
Runtime introspection of fget / fset / fdel works the same as before. I've added a test case for this.
## Forward compat
Users of python<3.11 will have property with [] type syntax via typing_extensions.
I don't think it is going to be widely used, though.
Also, since this requires type checkers to change, do we need a PEP?
I cannot speak for all type-checkers, but I know how it works in mypy. Mypy already supports descriptors. So, this example works:
classDesc:
def__get__(self, obj, typ) ->int: passclassSome:
a=Desc()
s=Some()
reveal_type(s.a) # N: Revealed type is "builtins.int"reveal_type(Some.a) # N: Revealed type is "builtins.int"
The same just works for my property stub example from python/typing#985
All in all, I don't think that we need a PEP for three reasons:
properties are already supported in all type checkers (with special casing), if it does not cause any trouble, existing behavior can be left untouched. Mypy has multiple problem with our special casing
Underlying mechanism - which are descriptors - is also supported
Change is relatively small, it does not add any new concepts
Feedback on this is welcome! Maybe I am missing something.
Honestly I think it's too soon for a PR given that we don't seem to have agreement in the typing tracker discussion.
This PR is really small. It took me like 30 mins, but we have a reference now.
We can close it anytime with no damage done!
Since the conclusion is that we can't do this without breaking backwards compatibility, should we just close this? Or is there still a compromise possible?
Activity
sobolevn commentedon Dec 23, 2021
Original discussion in
typingbug tracker: python/typing#985Short description:
property[GetType, SetType]is required for us to remove a lot of special casing from type-checkers and just use the primitive typelist/dict/ other primitive types have under PEP-585Open questions:
from __future__ import annotationswill just work for this new change. Is there anything I should do in scope of this PR? Is my assumption about__future__import is even correct in this context? Do I need to test that it works with__future__ annotations?sobolevn commentedon Dec 23, 2021
One more question about PEP-585: it does not specify
property. Do we need to update it?gvanrossum commentedon Dec 23, 2021
Yes, it is too late for 3.10 (but you can add it to typing_extensions). Also, PEP-585 is done, we don't update PEPs. Please do test with
from __future__ import annotations-- you never know.When this was first proposed (python/typing#985) there were worries about backwards compatibility. Given how common property is, we need to make sure there are no problems with that. Can you address that? I don't see it in the original thread.
Also, since this requires type checkers to change, do we need a PEP?
Finally. Please keep discussion in this bpo issue, don't have long discussions on the PR. (Honestly I think it's too soon for a PR given that we don't seem to have agreement in the typing tracker discussion.)
sobolevn commentedon Dec 24, 2021
Thanks, Guido!
Got it!
Done, PR is updated. Now we test that
propertyworks with future import.I guess you were thinking about this one: python/typing#594
Here's a list of problem from the original thread:
## the returned value of property has no typing equivalent
Now there is:
property[G, S]## There is no consistency in how properties in classes work in comparison to normal variables or functions
Author points out that all python versions right now ignore
propertys whenget_type_hints()is used. There's nothing we can do here: it is not related topropertys being generic in any way.Here's how it works before my patch:
I've added a test case for my patch to make sure this behavior is not changed. And indeed, it works exactly the same as before.
I've also covered a part from python/typing#594 (comment)
Runtime introspection of
fget/fset/fdelworks the same as before. I've added a test case for this.## Forward compat
Users of python<3.11 will have
propertywith[]type syntax viatyping_extensions.I don't think it is going to be widely used, though.
I cannot speak for all type-checkers, but I know how it works in mypy. Mypy already supports descriptors. So, this example works:
The same just works for my
propertystub example from python/typing#985All in all, I don't think that we need a PEP for three reasons:
Feedback on this is welcome! Maybe I am missing something.
This PR is really small. It took me like 30 mins, but we have a reference now.
We can close it anytime with no damage done!
serhiy-storchaka commentedon Dec 24, 2021
Does it mean that property[GetType, SetType] will be required and MyPy will complain if the raw property decorator be used?
sobolevn commentedon Dec 24, 2021
Serhiy, no, we can infer that.
There are two general cases:
x = property(x_get, x_set), it is just ideal@property xand@x.setter, it is also inferable with a bit of special casing for the mutable type part (we mutate the type ofxwhen adding a setter)gvanrossum commentedon Jan 11, 2022
Since the conclusion is that we can't do this without breaking backwards compatibility, should we just close this? Or is there still a compromise possible?
sobolevn commentedon Jan 11, 2022
Looks like no one showed much interest in it :(
So, yeah, closing it is probably the best idea.
Thanks everyone!