8000 bpo-43224: Implement pickling of TypeVarTuples by mrahtz · Pull Request #32119 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

bpo-43224: Implement pickling of TypeVarTuples #32119

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

Merged
merged 12 commits into from
Apr 22, 2022
Merged
Prev Previous commit
Next Next commit
Test all pickle protocol versions
  • Loading branch information
mrahtz committed Mar 28, 2022
commit f234214190a57e013b7e8abee3dc0844a470e581
59 changes: 41 additions & 18 deletions < 8000 span class="Truncate"> Lib/test/test_typing.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import contextlib
import collections
from functools import lru_cache
from functools import lru_cache, wraps
import inspect
import pickle
import re
Expand Down Expand Up @@ -67,6 +67,18 @@ def clear_caches(self):
f()


def all_pickle_protocols(test_func):
"""Runs `test_func` with various values for `proto` argument."""

@wraps(test_func)
def wrapper(self):
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
with self.subTest(pickle_proto=proto):
test_func(self, proto=proto)

return wrapper


class Employee:
pass

Expand Down Expand Up @@ -845,72 +857,83 @@ class TypeVarTuplePicklingTests(BaseTestCase):
# tests into the global scope with `global` statements at the start of each
# test.

def test_pickling_then_unpickling_results_in_equality(self):
@all_pickle_protocols
def test_pickling_then_unpickling_results_in_equality(self, proto):
global Ts1 # See explanation at start of class.
Ts1 = TypeVarTuple('Ts1')
Ts2 = pickle.loads(pickle.dumps(Ts1))
Ts2 = pickle.loads(pickle.dumps(Ts1, proto))
self.assertEqual(Ts1, Ts2)

def test_pickling_then_unpickling_unpacked_results_in_equality(self):
@all_pickle_protocols
def test_pickling_then_unpickling_unpacked_results_in_equality(self, proto):
global Ts # See explanation at start of class.
Ts = TypeVarTuple('Ts')
unpacked1 = Unpack[Ts]
unpacked2 = pickle.loads(pickle.dumps(unpacked1))
unpacked2 = pickle.loads(pickle.dumps(unpacked1, proto))
self.assertEqual(unpacked1, unpacked2)

def test_pickling_then_unpickling_variadic_class_results_in_equality(self):
@all_pickle_protocols
def test_pickling_then_unpickling_variadic_class_results_in_equality(
self, proto
):
global T, Ts, A1, B1 # See explanation at start of class.
T = TypeVar('T')
Ts = TypeVarTuple('Ts')

class A1(Generic[Unpack[Ts]]): pass
A2 = pickle.loads(pickle.dumps(A1))
A2 = pickle.loads(pickle.dumps(A1, proto))
self.assertEqual(A1, A2)

class B1(Generic[T, Unpack[Ts]]): pass
B2 = pickle.loads(pickle.dumps(B1))
B2 = pickle.loads(pickle.dumps(B1, proto))
self.assertEqual(B1, B2)

def test_pickling_then_unpickling_tuple_with_typevartuple_equality(self):
@all_pickle_protocols
def test_pickling_then_unpickling_tuple_with_typevartuple_equality(
self, proto
):
global T, Ts # See explanation at start of class.
T = TypeVar('T')
Ts = TypeVarTuple('Ts')

a1 = Tuple[Unpack[Ts]]
a2 = pickle.loads(pickle.dumps(a1))
a2 = pickle.loads(pickle.dumps(a1, proto))
self.assertEqual(a1, a2)

a1 = Tuple[T, Unpack[Ts]]
a2 = pickle.loads(pickle.dumps(a1))
a2 = pickle.loads(pickle.dumps(a1, proto))
self.assertEqual(a1, a2)

a1 = Tuple[int, Unpack[Ts]]
a2 = pickle.loads(pickle.dumps(a1))
a2 = pickle.loads(pickle.dumps(a1, proto))
self.assertEqual(a1, a2)

def test_pickling_then_unpickling_variadic_func_results_in_equality(self):
@all_pickle_protocols
def test_pickling_then_unpickling_variadic_func_results_in_equality(
self, proto
):
global T, Ts, a1, b1, c1, d1, e1 # See explanation at start of class.
T = TypeVar('T')
Ts = TypeVarTuple('Ts')

def a1(*args: Unpack[Ts]): pass
a2 = pickle.loads(pickle.dumps(a1))
a2 = pickle.loads(pickle.dumps(a1, proto))
self.assertEqual(a1, a2)

def b1(*args: Unpack[Tuple[int]]): pass
b2 = pickle.loads(pickle.dumps(b1))
b2 = pickle.loads(pickle.dumps(b1, proto))
self.assertEqual(b1, b2)

def c1(*args: Unpack[Tuple[int, ...]]): pas 656B s
c2 = pickle.loads(pickle.dumps(c1))
c2 = pickle.loads(pickle.dumps(c1, proto))
self.assertEqual(c1, c2)

def d1(*args: Unpack[Tuple[int, Unpack[Ts]]]): pass
d2 = pickle.loads(pickle.dumps(d1))
d2 = pickle.loads(pickle.dumps(d1, proto))
self.assertEqual(d1, d2)

def e1(*args: Unpack[Tuple[T, Unpack[Ts]]]): pass
e2 = pickle.loads(pickle.dumps(e1))
e2 = pickle.loads(pickle.dumps(e1, proto))
self.assertEqual(e1, e2)


Expand Down
0