bpo-46998: Allow subclassing Any at runtime by hauntsaninja · Pull Request #31841 · python/cpython (original) (raw)

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Conversation25 Commits15 Checks0 Files changed

Conversation

This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters

[ Show hidden characters]({{ revealButtonHref }})

hauntsaninja

hauntsaninja added 2 commits

March 12, 2022 19:10

@hauntsaninja

This PR also permits issubclass(X, Any). I don't actually have a use case for doing so, so happy to forbid it if people feel strongly.

The error in functools.singledispatch used to be TypeError: Invalid annotation for 'x'. typing.Any is not a class.. Since typing.Any is now a class, that isn't quite true. We could add a special case check in singledispatch against typing.Any if we think it's important to prevent its use. The dedicated tests for Any were added very recently, in #30050

@blurb-it

JelleZijlstra

@@ -2802,8 +2802,6 @@ def f(arg):
f.register(list[int] | str, lambda arg: "types.UnionTypes(types.GenericAlias)")
with self.assertRaisesRegex(TypeError, "Invalid first argument to "):
f.register(typing.List[float] | bytes, lambda arg: "typing.Union[typing.GenericAlias]")
with self.assertRaisesRegex(TypeError, "Invalid first argument to "):
f.register(typing.Any, lambda arg: "typing.Any")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This might be worth forbidding explicitly because the behavior could be quite unintuitive. Happy to leave that decision to the functools maintainer though.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ambv, do you have any thoughts on the bits of this PR that touch singledispatch?

@_SpecialForm
def Any(self, parameters):
class _AnyMeta(type):
def __instancecheck__(self, obj):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we even have this? isinstance(X, Any) is now a meaningful operation.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with removing it (as this PR currently does for issubclass). Doing so would also allow us to get rid of the metaclass, which will help remove restrictions on what classes can inherit from Any.

My reasoning for keeping it is that isinstance is very commonly used, potentially by typing / Python novices, and isinstance(..., Any) doesn't correspond well to the notion of Any at type check time. Sophisticated users have workarounds available to them for the equivalent isinstance check.

@@ -428,8 +428,15 @@ def __getitem__(self, parameters):
return self._getitem(self, *parameters)
@_SpecialForm
def Any(self, parameters):
class _AnyMeta(type):

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The metaclass is unfortunate because it restricts what classes can double-inherit from Any (due to metaclass conflicts). Seems unavoidable though.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not entirely unavoidable, if we were willing to give up on instancecheck (and repr), I'd say we could just remove the metaclass entirely

hauntsaninja and others added 6 commits

March 13, 2022 14:38

@hauntsaninja @JelleZijlstra

Co-authored-by: Jelle Zijlstra jelle.zijlstra@gmail.com

JelleZijlstra

@JelleZijlstra

Planning to merge in a few days unless there's more discussion.

JelleZijlstra

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking at it again, I realize we should document this. Probably fine to just add a note like .. versionchanged: 3.11: Any can now be used as a base class.

@bedevere-bot

A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated.

Once you have made the requested changes, please leave a comment on this pull request containing the phrase I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request.

And if you don't make the requested changes, you will be poked with soft cushions!

@bedevere-bot

Thanks for making the requested changes!

@JelleZijlstra: please review the changes made to this pull request.

hauntsaninja added 2 commits

March 29, 2022 22:08

merwok

@@ -578,6 +578,9 @@ These can be used as types in annotations and do not support ``[]``.
* Every type is compatible with :data:`Any`.
* :data:`Any` is compatible with every type.
.. versionchanged:: 3.11
:data:`Any` can now be used as a base class

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add some explanation about the use cases?

This doesn’t say why someone could want that, nor does the ticket, one has to hunt for the last message in the mailing list thread!

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added a sentence here. Let me know if I should make it longer; I tried to keep it short because this is a lot more niche than other things covered in typing.rst

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think adding one short example might be nice

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure about this. On the one hand an example would be useful; on the other hand it risks putting too much emphasis on a pretty obscure use case.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's omit the example then (devguide says "err on the side of being succinct" for docs). I'm hoping to do some work on typing docs sometime soon, which might be a better home for such details.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alrighty!

hauntsaninja added 2 commits

March 30, 2022 14:54

JelleZijlstra

bmwiedemann pushed a commit to bmwiedemann/openSUSE that referenced this pull request

Oct 27, 2022

@bmwiedemann

https://build.opensuse.org/request/show/1031001 by user mcepl + dimstar_suse

kraj pushed a commit to YoeDistro/poky that referenced this pull request

Nov 2, 2022

@moto-timo @alexandrebelloni

https://github.com/python/typing_extensions/blob/main/CHANGELOG.md#release-440-october-6-2022

Release 4.4.0 (October 6, 2022)

(From OE-Core rev: 0b8f212744f8de7e6b33ab02d042009eba462241)

Signed-off-by: Tim Orling tim.orling@konsulko.com Signed-off-by: Alexandre Belloni alexandre.belloni@bootlin.com

kraj pushed a commit to YoeDistro/poky that referenced this pull request

Nov 2, 2022

@moto-timo @kraj

https://github.com/python/typing_extensions/blob/main/CHANGELOG.md#release-440-october-6-2022

Release 4.4.0 (October 6, 2022)

(From OE-Core rev: 0b8f212744f8de7e6b33ab02d042009eba462241)

Signed-off-by: Tim Orling tim.orling@konsulko.com Signed-off-by: Alexandre Belloni alexandre.belloni@bootlin.com

kraj pushed a commit to YoeDistro/poky that referenced this pull request

Nov 2, 2022

@moto-timo @alexandrebelloni

https://github.com/python/typing_extensions/blob/main/CHANGELOG.md#release-440-october-6-2022

Release 4.4.0 (October 6, 2022)

(From OE-Core rev: 34c8f1eac66ae770d64eaa854b1f263848210773)

Signed-off-by: Tim Orling tim.orling@konsulko.com Signed-off-by: Alexandre Belloni alexandre.belloni@bootlin.com

kraj pushed a commit to YoeDistro/poky that referenced this pull request

Nov 4, 2022

@moto-timo @alexandrebelloni

https://github.com/python/typing_extensions/blob/main/CHANGELOG.md#release-440-october-6-2022

Release 4.4.0 (October 6, 2022)

License-Update: update copyright years; align with CPython LICENSE

See python/typing_extensions#63

(From OE-Core rev: 6dc6c11b638c1d45f4dc9c7813f93a09229c33b3)

Signed-off-by: Tim Orling tim.orling@konsulko.com Signed-off-by: Alexandre Belloni alexandre.belloni@bootlin.com

kraj pushed a commit to YoeDistro/poky that referenced this pull request

Nov 4, 2022

@moto-timo @alexandrebelloni

https://github.com/python/typing_extensions/blob/main/CHANGELOG.md#release-440-october-6-2022

Release 4.4.0 (October 6, 2022)

License-Update: update copyright years; align with CPython LICENSE

See python/typing_extensions#63

(From OE-Core rev: 0cb15457edaa6cee3ac152a18d8b6ba4204dd958)

Signed-off-by: Tim Orling tim.orling@konsulko.com Signed-off-by: Alexandre Belloni alexandre.belloni@bootlin.com

kraj pushed a commit to YoeDistro/poky that referenced this pull request

Nov 7, 2022

@moto-timo @alexandrebelloni

https://github.com/python/typing_extensions/blob/main/CHANGELOG.md#release-440-october-6-2022

Release 4.4.0 (October 6, 2022)

License-Update: update copyright years; align with CPython LICENSE

See python/typing_extensions#63

(From OE-Core rev: 0cb15457edaa6cee3ac152a18d8b6ba4204dd958)

Signed-off-by: Tim Orling tim.orling@konsulko.com Signed-off-by: Alexandre Belloni alexandre.belloni@bootlin.com

rpurdie pushed a commit to yoctoproject/poky that referenced this pull request

Nov 7, 2022

@moto-timo @rpurdie

https://github.com/python/typing_extensions/blob/main/CHANGELOG.md#release-440-october-6-2022

Release 4.4.0 (October 6, 2022)

License-Update: update copyright years; align with CPython LICENSE

See python/typing_extensions#63

(From OE-Core rev: 15ca091ae01ae298c013e8cf82ee6af382259ed8)

Signed-off-by: Tim Orling tim.orling@konsulko.com Signed-off-by: Alexandre Belloni alexandre.belloni@bootlin.com Signed-off-by: Richard Purdie richard.purdie@linuxfoundation.org

halstead pushed a commit to openembedded/openembedded-core that referenced this pull request

Nov 7, 2022

@moto-timo @rpurdie

https://github.com/python/typing_extensions/blob/main/CHANGELOG.md#release-440-october-6-2022

Release 4.4.0 (October 6, 2022)

License-Update: update copyright years; align with CPython LICENSE

See python/typing_extensions#63

Signed-off-by: Tim Orling tim.orling@konsulko.com Signed-off-by: Alexandre Belloni alexandre.belloni@bootlin.com

mtremer pushed a commit to ipfire/ipfire-2.x that referenced this pull request

Nov 11, 2022

@pmu-ipf

…thon-3.10.8

Tested-by: Adolf Belka adolf.belka@ipfire.org Signed-off-by: Adolf Belka adolf.belka@ipfire.org

daregit pushed a commit to daregit/yocto-combined that referenced this pull request

May 22, 2024

@moto-timo @rpurdie

https://github.com/python/typing_extensions/blob/main/CHANGELOG.md#release-440-october-6-2022

Release 4.4.0 (October 6, 2022)

License-Update: update copyright years; align with CPython LICENSE

See python/typing_extensions#63

(From OE-Core rev: 15ca091ae01ae298c013e8cf82ee6af382259ed8)

Signed-off-by: Tim Orling tim.orling@konsulko.com Signed-off-by: Alexandre Belloni alexandre.belloni@bootlin.com Signed-off-by: Richard Purdie richard.purdie@linuxfoundation.org

Reviewers

@merwok merwok merwok left review comments

@AlexWaygood AlexWaygood AlexWaygood left review comments

@JelleZijlstra JelleZijlstra JelleZijlstra approved these changes

@gvanrossum gvanrossum Awaiting requested review from gvanrossum

@Fidget-Spinner Fidget-Spinner Awaiting requested review from Fidget-Spinner

@rhettinger rhettinger Awaiting requested review from rhettinger rhettinger is a code owner