Sitelet https://github.com/python/cpython/issues/94245
Skip to content

pickling fails for typing.Tuple[()] #94245

Description

@ryanthompson591

Bug report

A clear and concise description of what the bug is.
Include a minimal, reproducible example (https://stackoverflow.com/help/minimal-reproducible-example), if possible.

import pickle
from typing import Tuple

j = Tuple[()]
serialized = pickle.dumps(j)
loaded = pickle.loads(serialized)

Error message:

Traceback (most recent call last):
  File "/Users/ryanthompson/PycharmProjects/learningProjects/dill_regression/regression_test.py", line 6, in <module>
    loaded = dill.loads(serialized)
  File "/Users/ryanthompson/.pyenv/versions/3.8.11/lib/python3.8/site-packages/dill/_dill.py", line 387, in loads
    return load(file, ignore, **kwds)
  File "/Users/ryanthompson/.pyenv/versions/3.8.11/lib/python3.8/site-packages/dill/_dill.py", line 373, in load
    return Unpickler(file, ignore=ignore, **kwds).load()
  File "/Users/ryanthompson/.pyenv/versions/3.8.11/lib/python3.8/site-packages/dill/_dill.py", line 646, in load
    obj = StockUnpickler.load(self)
  File "/Users/ryanthompson/.pyenv/versions/3.8.11/lib/python3.8/typing.py", line 804, in __getitem__
    return self.__getitem_inner__(params)
  File "/Users/ryanthompson/.pyenv/versions/3.8.11/lib/python3.8/typing.py", line 261, in inner
    return func(*args, **kwds)
  File "/Users/ryanthompson/.pyenv/versions/3.8.11/lib/python3.8/typing.py", line 830, in __getitem_inner__
    params = tuple(_type_check(p, msg) for p in params)
  File "/Users/ryanthompson/.pyenv/versions/3.8.11/lib/python3.8/typing.py", line 830, in <genexpr>
    params = tuple(_type_check(p, msg) for p in params)
  File "/Users/ryanthompson/.pyenv/versions/3.8.11/lib/python3.8/typing.py", line 149, in _type_check
    raise TypeError(f"{msg} Got {arg!r:.100}.")
TypeError: Tuple[t0, t1, ...]: each t must be a type. Got ().


Your environment
python 3.8

  • CPython versions tested on:
    3.6 & 3.8
  • Operating system and architecture:
    Mac OS

Activity

  1. JelleZijlstra commented on Jun 24, 2022

    @JelleZijlstra
    Member

    Thanks for the report. I can reproduce on 3.9 and 3.10, but not a recent build of 3.11. I assume @serhiy-storchaka's changes to the representation of empty tuples fixed this issue.

    We're not going to fix this for 3.9 and lower because those branches are in security fix-only mode, but we can still fix it on 3.10.

  2. mmckerns commented on Jun 24, 2022

    @mmckerns

    Just for completeness... here's a little more information on the bug (from the OP issue at dill):

    >>> import pickle
    >>> import typing
    >>> t = typing.Tuple[()]
    >>> t
    typing.Tuple[()]
    >>> t = t.copy_with(())
    >>> t
    typing.Tuple[]
    >>> s = pickle.dumps(t)
    >>> pickle.loads(s)
    typing.Tuple[()]
    >>> typing.Tuple[]
      File "<stdin>", line 1
        typing.Tuple[]
                     ^
    SyntaxError: invalid syntax
    
  3. added 2 commits that reference this issue on Jun 25, 2022
  4. serhiy-storchaka commented on Jun 25, 2022

    @serhiy-storchaka
    Member

    Backporting #31836 can fix this issue. #94260 is an alternate fix. #94259 contains tests, they should be added in all versions.

  5. added 2 commits that reference this issue on Jun 25, 2022
  6. added 3 commits that reference this issue on Jun 25, 2022
  7. added a commit that references this issue on Jun 26, 2022
  8. added a commit that references this issue on Jul 25, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions