Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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 and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bpo-44863: In TypedDict allow inherit from Generic and preserve bases #27663
bpo-44863: In TypedDict allow inherit from Generic and preserve bases #27663
Changes from 7 commits
6cfdc5f
c022e44
2fa00b8
b829d8a
c5762df
4c5db0a
34189dd
0cfd637
5e808af
a2482ff
071c1b6
3ce517b
2f003e0
964f7d3
c3c0e51
d34c99e
cea66c4
0ed4326
b1fcd16
2905f29
afa5e51
94138f6
2572930
c2e1d8d
d3d9456
311852c
dc98753
9bed1d4
6c152e7
f88201b
6ea95df
80e9104
dbbb707
56b69e0
4a40825
4b50ae2
ecc7726
5b5a983
99a1430
79c2bb4
File filter
Filter by extension
Conversations
Jump to
There are no files selected for viewing
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think there are no need to define
__getitem__
method as far asGeneric
class has__class_getitem__
method.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I had two issues by not overriding the default:
__getitem__
fromdict
meta):There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Fidget-Spinner What is your opinion about issue mentioned by Samodya?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For 1st issue:
That happens because
_BaseGenericAlias.__getattr__
intentionally doesn't proxy dunders toself.__origin__
https://github.com/python/cpython/blob/main/Lib/typing.py#L966. I don't know what's the correct behavior until I read the final version of the proposed PEP update/ PEP. Sorry.For the 2nd behavior:
Since python 3.9, builtin generics support subscripting thanks to PEP 585. E.g.
dict[str, int]
. Since subclassing TypedDict subclassesdict
, it also pullsdict.__class_getitem__
(and hence the type supports arbitrary subscripting). A quick way to verify this:There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Re 1: Dunder proxying behavior isn't specified in the PEP draft either :) I switched gears to add this feature through a bpo and implementation as I am not sure whether this change needed a PEP/PEP update (my reasoning in the ticket description). By any chance do you know a PEP that specifies the behavior of
GenericAlias
for another type?Re 2: I see. Thank you. But that does seem like something that shouldn't be allowed for a non generic Typeddict (Not a big deal though since it doesn't really do anything).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Considering following is the behavior for normal Generic class, I will revert the overriding of
__getitem__
and not proxy the dunder attributes.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there a reason why you're using the builtin
types.GenericAlias
vs the typingtyping._GenericAlias
version?IMO, I'd prefer you use the typing version. It's much easier to subclass and customize. It also supports older Python versions if you're porting this to
typing_extensions
.types.GenericAlias
only works for Python 3.9 onwards. (Also, I think there isn't a precedent for things in typing returning atypes.GenericAlias
.)There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
types.GenericAlias
was chosen just to circumvent the fact thattyping._GenericAlias
doesn't proxy the dunder attributes (specifically__required_keys__
,__optional_keys__
etc.). Given your reasoning we can make the change to override__getattr__
oftyping._GenericAlias
. That is assuming we want to proxy those attributes.