Skip to content

4.7.0

Compare
Choose a tag to compare
@JelleZijlstra JelleZijlstra released this 28 Jun 21:04
· 61 commits to main since this release
633d2e2

This is a feature release. Major changes include:

  • All non-deprecated names from typing are now re-exported by typing_extensions for convenience
  • Add typing_extensions.get_protocol_members and typing_extensions.is_protocol
  • Declare support for Python 3.12
  • This will be the last feature release to support Python 3.7, which recently reached its end-of-life

Full changelog of versions 4.7.0 and 4.7.0rc1:

Release 4.7.0 (June 28, 2023)

  • This is expected to be the last feature release supporting Python 3.7,
    which reaches its end of life on June 27, 2023. Version 4.8.0 will support
    only Python 3.8.0 and up.
  • Fix bug where a typing_extensions.Protocol class that had one or more
    non-callable members would raise TypeError when issubclass()
    was called against it, even if it defined a custom __subclasshook__
    method. The correct behaviour -- which has now been restored -- is not to
    raise TypeError in these situations if a custom __subclasshook__ method
    is defined. Patch by Alex Waygood (backporting
    python/cpython#105976).

Release 4.7.0rc1 (June 21, 2023)

  • Add typing_extensions.get_protocol_members and
    typing_extensions.is_protocol (backport of CPython PR #104878).
    Patch by Jelle Zijlstra.
  • typing_extensions now re-exports all names in the standard library's
    typing module, except the deprecated ByteString. Patch by Jelle
    Zijlstra.
  • Due to changes in the implementation of typing_extensions.Protocol,
    typing.runtime_checkable can now be used on typing_extensions.Protocol
    (previously, users had to use typing_extensions.runtime_checkable if they
    were using typing_extensions.Protocol).
  • Align the implementation of TypedDict with the implementation in the
    standard library on Python 3.9 and higher.
    typing_extensions.TypedDict is now a function instead of a class. The
    private functions _check_fails, _dict_new, and _typeddict_new
    have been removed. is_typeddict now returns False when called with
    TypedDict itself as the argument. Patch by Jelle Zijlstra.
  • Declare support for Python 3.12. Patch by Jelle Zijlstra.
  • Fix tests on Python 3.13, which removes support for creating
    TypedDict classes through the keyword-argument syntax. Patch by
    Jelle Zijlstra.
  • Fix a regression introduced in v4.6.3 that meant that
    issubclass(object, typing_extensions.Protocol) would erroneously raise
    TypeError. Patch by Alex Waygood (backporting the CPython PR
    python/cpython#105239).
  • Allow Protocol classes to inherit from typing_extensions.Buffer or
    collections.abc.Buffer. Patch by Alex Waygood (backporting
    python/cpython#104827, by Jelle Zijlstra).
  • Allow classes to inherit from both typing.Protocol and typing_extensions.Protocol
    simultaneously. Since v4.6.0, this caused TypeError to be raised due to a
    metaclass conflict. Patch by Alex Waygood.
  • Backport several deprecations from CPython relating to unusual ways to
    create TypedDicts and NamedTuples. CPython PRs #105609 and #105780
    by Alex Waygood; typing_extensions backport by Jelle Zijlstra.
    • Creating a NamedTuple using the functional syntax with keyword arguments
      (NT = NamedTuple("NT", a=int)) is now deprecated.
    • Creating a NamedTuple with zero fields using the syntax NT = NamedTuple("NT")
      or NT = NamedTuple("NT", None) is now deprecated.
    • Creating a TypedDict with zero fields using the syntax TD = TypedDict("TD")
      or TD = TypedDict("TD", None) is now deprecated.
  • Fix bug on Python 3.7 where a protocol X that had a member a would not be
    considered an implicit subclass of an unrelated protocol Y that only has a
    member a. Where the members of X are a superset of the members of Y,
    X should always be considered a subclass of Y iff Y is a
    runtime-checkable protocol that only has callable members. Patch by Alex
    Waygood (backporting CPython PR
    python/cpython#105835).