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

Allow TypedDict to inherit from Generics #89026

Closed
sransara mannequin opened this issue Aug 7, 2021 · 9 comments
Closed

Allow TypedDict to inherit from Generics #89026

sransara mannequin opened this issue Aug 7, 2021 · 9 comments
Labels
3.11 only security fixes stdlib Python modules in the Lib dir topic-typing type-feature A feature request or enhancement

Comments

@sransara
Copy link
Mannequin

sransara mannequin commented Aug 7, 2021

BPO 44863
Nosy @gvanrossum, @rhettinger, @serhiy-storchaka, @graingert, @JelleZijlstra, @sobolevn, @Fidget-Spinner, @AlexWaygood, @sransara, @cdce8p, @toburger
PRs
  • bpo-44863: In TypedDict allow inherit from Generic and preserve bases #27663
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = None
    created_at = <Date 2021-08-07.19:04:47.278>
    labels = ['type-feature', 'library', '3.11']
    title = 'Allow TypedDict to inherit from Generics'
    updated_at = <Date 2022-03-07.00:48:26.270>
    user = 'https://github.com/sransara'

    bugs.python.org fields:

    activity = <Date 2022-03-07.00:48:26.270>
    actor = 'rhettinger'
    assignee = 'none'
    closed = False
    closed_date = None
    closer = None
    components = ['Library (Lib)']
    creation = <Date 2021-08-07.19:04:47.278>
    creator = 'sransara'
    dependencies = []
    files = []
    hgrepos = []
    issue_num = 44863
    keywords = ['patch']
    message_count = 8.0
    messages = ['399201', '399579', '401077', '401087', '401134', '401138', '412439', '414631']
    nosy_count = 12.0
    nosy_names = ['gvanrossum', 'rhettinger', 'python-dev', 'serhiy.storchaka', 'graingert', 'JelleZijlstra', 'sobolevn', 'kj', 'AlexWaygood', 'sransara', 'cdce8p', 'toburger']
    pr_nums = ['27663']
    priority = 'normal'
    resolution = None
    stage = 'patch review'
    status = 'open'
    superseder = None
    type = 'enhancement'
    url = 'https://bugs.python.org/issue44863'
    versions = ['Python 3.11']

    @sransara
    Copy link
    Mannequin Author

    sransara mannequin commented Aug 7, 2021

    TypedDict PEP-589 says:
    A TypedDict cannot inherit from both a TypedDict type and a non-TypedDict base class.

    So the current implementation has:
    if type(base) is not _TypedDictMeta: raise TypeError(...)

    This restricts the user from defining generic TypedDicts in the natural class based syntax:
    class Pager(TypedDict, Generic[T]): ...

    Although PEP-589 doesn't explicitly state generic support, I believe it is complete in covering the specification even if generics were involved (at least for the class based syntax).

    I have tried putting together a PEP from guidance of typing-sig <https://github.com/sransara/py-generic-typeddict/blob/master/pep-9999.rst\>. There is not much new contributions by that draft, except for specifying the alternative syntax and being more explicit about Generics.

    So I'm wondering if it would be possible to relax the constraint: TypedDict inheritance to include Generic. In my point of view Generic is more of a mixin, so it doesn't go against the PEP-589. Or is this change big enough to warrant a PEP?

    @sransara sransara mannequin added 3.10 only security fixes 3.11 only security fixes stdlib Python modules in the Lib dir type-feature A feature request or enhancement labels Aug 7, 2021
    @gvanrossum
    Copy link
    Member

    See also python/mypy#3863

    @Fidget-Spinner
    Copy link
    Member

    Guido, OP has kindly written a mini PEP for this. Do you think just updating PEP-589 is sufficient, or do we need a full PEP?

    (PS. Changed version to 3.11 since we've missed the train for 3.10 enhancements).

    @Fidget-Spinner Fidget-Spinner removed 3.10 only security fixes labels Sep 5, 2021
    @gvanrossum
    Copy link
    Member

    Updating an existing (standards track) PEP significantly is not
    traditional. I recommend writing a new PEP.

    On Sun, Sep 5, 2021 at 01:24 Ken Jin <report@bugs.python.org> wrote:

    Ken Jin <kenjin4096@gmail.com> added the comment:

    Guido, OP has kindly written a mini PEP for this. Do you think just
    updating PEP-589 is sufficient, or do we need a full PEP?

    (PS. Changed version to 3.11 since we've missed the train for 3.10
    enhancements).

    ----------
    versions: -Python 3.10


    Python tracker <report@bugs.python.org>
    <https://bugs.python.org/issue44863\>


    --
    --Guido (mobile)

    @sransara
    Copy link
    Mannequin Author

    sransara mannequin commented Sep 6, 2021

    My initial intention to create this ticket was to explore the idea that if we could side step from creating a PEP or updating PEP-589.

    IMO only contribution from a new PEP will be:

    1. relaxing this line from PEP-589 and be explicit to include Generic: "A TypedDict cannot inherit from both a TypedDict type and a non-TypedDict base class." (IMO by thinking Generic as a mixin even this is not needed)
    2. may be syntax for generic in the alternative syntax (side note: collecting typevars from the values is hard to implement because of forward refs)
    3. Some explicit generic examples for good measure

    I believe PEP-589 is complete in covering all semantic details even with Generics. Even structural subtyping because it says: "Value types behave invariantly, since TypedDict objects are mutable."

    My understanding was that during initial implementation this was not done for the sake of implementation simplicity (days before PEP-560).

    All that said, a new PEP would be a good way to notify the type checkers of this capability.

    Is there a better place to have this conversation?

    @gvanrossum
    Copy link
    Member

    Since this primarily affects static type checkers such as mypy, Pyre and pyright, it’s best to discuss it on typing-sig.

    @graingert
    Copy link
    Mannequin

    graingert mannequin commented Feb 3, 2022

    there's a thread on typing-sig for this now: https://mail.python.org/archives/list/typing-sig@python.org/thread/I7P3ER2NH7SENVMIXK74U6L4Z5JDLQGZ/#I7P3ER2NH7SENVMIXK74U6L4Z5JDLQGZ

    @rhettinger
    Copy link
    Contributor

    Related issue: https://bugs.python.org/issue43923

    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    @JelleZijlstra
    Copy link
    Member

    This will be in Python 3.11 (#27663). Thanks @sransara for the PR and @serhiy-storchaka, @uriyyo, @Fidget-Spinner, @davidfstr, and @sobolevn for reviewing it!

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    3.11 only security fixes stdlib Python modules in the Lib dir topic-typing type-feature A feature request or enhancement
    Projects
    None yet
    Development

    No branches or pull requests

    5 participants