Skip to content
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-43923: Add support of generic typing.NamedTuple #92027

Merged

Conversation

serhiy-storchaka
Copy link
Member

@serhiy-storchaka serhiy-storchaka commented Apr 28, 2022

Closes #88089.

@JelleZijlstra
Copy link
Member

Thanks for implementing this, but I think it needs some coordination with static type checkers to see if they have concerns. I know mypy's architecture makes generic namedtuples a little hard to support.

@AlexWaygood
Copy link
Member

AlexWaygood commented Apr 28, 2022

Thanks for implementing this, but I think it needs some coordination with static type checkers to see if they have concerns. I know mypy's architecture makes generic namedtuples a little hard to support.

I still disagree on this — there's no obligation on type checkers to support generic NamedTuples if this is merged. This does, however, open up the possibility of them being able to support that feature if they ever decide they'd like to in the future.

I thought you were usually on the side of the runtime being as permissive as possible ;)

@JelleZijlstra
Copy link
Member

I probably agree, but I want to give type checker maintainers a chance to say "don't do this, it will introduce a giant soundness hole". I'll ask about it in the summit in a few hours.

Copy link
Member

@gvanrossum gvanrossum left a comment

Choose a reason for hiding this comment

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

Other than one nit I would be fine if this goes into 3.11.

(I have a niggling worry about variance, but that shouldn't stop us from supporting this at runtime. Mypy doesn't support it yet anyway.)

Lib/typing.py Outdated Show resolved Hide resolved
Copy link
Member

@JelleZijlstra JelleZijlstra left a comment

Choose a reason for hiding this comment

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

Looks good, just a wording suggestion.

I mentioned this at the typing summit today and people seemed positive. I also sent an email to typing-sig about it. Unless somebody brings up a compelling objection I'll merge this change before the feature freeze.

Doc/library/typing.rst Outdated Show resolved Hide resolved
@redgoldlace
Copy link

I probably agree, but I want to give type checker maintainers a chance to say "don't do this, it will introduce a giant soundness hole". I'll ask about it in the summit in a few hours.

I think asking for this kind of feedback is perfectly reasonable since the people maintaining type checkers tend to have a pretty good mental model of what is/isn't sound. That being said, I don't really like the idea of blocking a change like this - which would improve ergonomics a lot! - because a third-party tool [1] cannot/will not implement support for it. It really rubs me the wrong way.

[1]: I'm actually really confused about Mypy's status in this regard. It's under the Python org on GH but appears to still be considered third-party? I've seen a couple of proposals get shot down because of implementation concerns from Mypy now, and it's honestly started to bug me a lot. To my knowledge Python's static type system isn't controlled by Mypy (and exists more as a model for other type checking tools to pick up) so those decisions have always seemed really weird to me. If it's not too much to ask I would really appreciate some explanation here.

@JelleZijlstra
Copy link
Member

@kaylynn234 it's not about mypy specifically; in fact, we know for a fact that mypy does not support this feature. There are other type checkers.

But the general idea is that typing.py exists to support the static type system, as specified in PEP-484 and subsequent PEPs. So we shouldn't add features to it that cannot be supported by static type checkers.

@serhiy-storchaka
Copy link
Member Author

Before merging this PR I would like to review similar PR for TypedDict: #27663.

@gvanrossum
Copy link
Member

Before merging this PR I would like to review similar PR for TypedDict: #27663.

I like that we're doing this for TypedDict too, but why wait for that before merging this? I don't see how they're linked. @serhiy-storchaka @JelleZijlstra

@JelleZijlstra
Copy link
Member

Before merging this PR I would like to review similar PR for TypedDict: #27663.

I like that we're doing this for TypedDict too, but why wait for that before merging this? I don't see how they're linked. @serhiy-storchaka @JelleZijlstra

I think there's similar implementation concerns on both. If there's something we missed on one of them, it may well apply to the other. For example, Serhyi just found an issue with the order of the bases for generic namedtuples, and we should make sure that the same issue doesn't apply to TypedDict.

@JelleZijlstra JelleZijlstra self-assigned this May 2, 2022
Doc/whatsnew/3.11.rst Outdated Show resolved Hide resolved
@JelleZijlstra JelleZijlstra merged commit b04e02c into python:main May 2, 2022
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Jul 25, 2022
Changes:
# Release 4.3.0 (July 1, 2022)

- Add `typing_extensions.NamedTuple`, allowing for generic `NamedTuple`s on
  Python <3.11 (backport from python/cpython#92027, by Serhiy Storchaka). Patch
  by Alex Waygood (@AlexWaygood).
- Adjust `typing_extensions.TypedDict` to allow for generic `TypedDict`s on
  Python <3.11 (backport from python/cpython#27663, by Samodya Abey). Patch by
  Alex Waygood (@AlexWaygood).

# Release 4.2.0 (April 17, 2022)

- Re-export `typing.Unpack` and `typing.TypeVarTuple` on Python 3.11.
- Add `ParamSpecArgs` and `ParamSpecKwargs` to `__all__`.
- Improve "accepts only single type" error messages.
- Improve the distributed package. Patch by Marc Mueller (@cdce8p).
- Update `typing_extensions.dataclass_transform` to rename the
  `field_descriptors` parameter to `field_specifiers` and accept
  arbitrary keyword arguments.
- Add `typing_extensions.get_overloads` and
  `typing_extensions.clear_overloads`, and add registry support to
  `typing_extensions.overload`. Backport from python/cpython#89263.
- Add `typing_extensions.assert_type`. Backport from bpo-46480.
- Drop support for Python 3.6. Original patch by Adam Turner (@AA-Turner).

# Release 4.1.1 (February 13, 2022)

- Fix importing `typing_extensions` on Python 3.7.0 and 3.7.1. Original
  patch by Nikita Sobolev (@sobolevn).

# Release 4.1.0 (February 12, 2022)

- Runtime support for PEP 646, adding `typing_extensions.TypeVarTuple`
  and `typing_extensions.Unpack`.
- Add interaction of `Required` and `NotRequired` with `__required_keys__`,
  `__optional_keys__` and `get_type_hints()`. Patch by David Cabot (@d-k-bo).
- Runtime support for PEP 675 and `typing_extensions.LiteralString`.
- Add `Never` and `assert_never`. Backport from bpo-46475.
- `ParamSpec` args and kwargs are now equal to themselves. Backport from
  bpo-46676. Patch by Gregory Beauregard (@GBeauregard).
- Add `reveal_type`. Backport from bpo-46414.
- Runtime support for PEP 681 and `typing_extensions.dataclass_transform`.
- `Annotated` can now wrap `ClassVar` and `Final`. Backport from
  bpo-46491. Patch by Gregory Beauregard (@GBeauregard).
- Add missed `Required` and `NotRequired` to `__all__`. Patch by
  Yuri Karabas (@uriyyo).
- The `@final` decorator now sets the `__final__` attribute on the
  decorated object to allow runtime introspection. Backport from
  bpo-46342.
- Add `is_typeddict`. Patch by Chris Moradi (@chrismoradi) and James
  Hilton-Balfe (@Gobot1234).

# Release 4.0.1 (November 30, 2021)

- Fix broken sdist in release 4.0.0. Patch by Adam Turner (@AA-Turner).
- Fix equality comparison for `Required` and `NotRequired`. Patch by
  Jelle Zijlstra (@JelleZijlstra).
- Fix usage of `Self` as a type argument. Patch by Chris Wesseling
  (@CharString) and James Hilton-Balfe (@Gobot1234).

# Release 4.0.0 (November 14, 2021)

- Starting with version 4.0.0, typing_extensions uses Semantic Versioning.
  See the README for more information.
- Dropped support for Python versions 3.5 and older, including Python 2.7.
- Simplified backports for Python 3.6.0 and newer. Patch by Adam Turner (@AA-Turner).

## Added in version 4.0.0

- Runtime support for PEP 673 and `typing_extensions.Self`. Patch by
  James Hilton-Balfe (@Gobot1234).
- Runtime support for PEP 655 and `typing_extensions.Required` and `NotRequired`.
  Patch by David Foster (@davidfstr).

## Removed in version 4.0.0

The following non-exported but non-private names have been removed as they are
unneeded for supporting Python 3.6 and newer.

- TypingMeta
- OLD_GENERICS
- SUBS_TREE
- HAVE_ANNOTATED
- HAVE_PROTOCOLS
- V_co
- VT_co

# Previous releases

Prior to release 4.0.0 we did not provide a changelog. Please check
the Git history for details.
mtremer pushed a commit to ipfire/ipfire-2.x that referenced this pull request Nov 11, 2022
…thon-3.10.8

- Updated from version 4.1.1 to 4.4.0
- Update of rootfile
- Changelog
    # Release 4.4.0 (October 6, 2022)
	- Add `typing_extensions.Any` a backport of python 3.11's Any class which is
	  subclassable at runtime. (backport from python/cpython#31841, by Shantanu
	  and Jelle Zijlstra). Patch by James Hilton-Balfe (@Gobot1234).
	- Add initial support for TypeVarLike `default` parameter, PEP 696.
	  Patch by Marc Mueller (@cdce8p).
	- Runtime support for PEP 698, adding `typing_extensions.override`. Patch by
	  Jelle Zijlstra.
	- Add the `infer_variance` parameter to `TypeVar`, as specified in PEP 695.
	  Patch by Jelle Zijlstra.
    # Release 4.3.0 (July 1, 2022)
	- Add `typing_extensions.NamedTuple`, allowing for generic `NamedTuple`s on
	  Python <3.11 (backport from python/cpython#92027, by Serhiy Storchaka). Patch
	  by Alex Waygood (@AlexWaygood).
	- Adjust `typing_extensions.TypedDict` to allow for generic `TypedDict`s on
	  Python <3.11 (backport from python/cpython#27663, by Samodya Abey). Patch by
	  Alex Waygood (@AlexWaygood).
    # Release 4.2.0 (April 17, 2022)
	- Re-export `typing.Unpack` and `typing.TypeVarTuple` on Python 3.11.
	- Add `ParamSpecArgs` and `ParamSpecKwargs` to `__all__`.
	- Improve "accepts only single type" error messages.
	- Improve the distributed package. Patch by Marc Mueller (@cdce8p).
	- Update `typing_extensions.dataclass_transform` to rename the
	  `field_descriptors` parameter to `field_specifiers` and accept
	  arbitrary keyword arguments.
	- Add `typing_extensions.get_overloads` and
	  `typing_extensions.clear_overloads`, and add registry support to
	  `typing_extensions.overload`. Backport from python/cpython#89263.
	- Add `typing_extensions.assert_type`. Backport from bpo-46480.
	- Drop support for Python 3.6. Original patch by Adam Turner (@AA-Turner).

Tested-by: Adolf Belka <adolf.belka@ipfire.org>
Signed-off-by: Adolf Belka <adolf.belka@ipfire.org>
Fatal1ty added a commit to Fatal1ty/mashumaro that referenced this pull request Jan 22, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
topic-typing type-feature A feature request or enhancement
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Can't create generic NamedTuple as of py3.9
6 participants