call. :issue:`2021`
- Fix dunder protocol (`copy`/`pickle`/etc) interaction with ``Undefined``
objects. :issue:`2025`
+- Fix `copy`/`pickle` support for the internal ``missing`` object.
+ :issue:`2027`
Version 3.1.4
F = t.TypeVar("F", bound=t.Callable[..., t.Any])
-# special singleton representing missing values for the runtime
-missing: t.Any = type("MissingType", (), {"__repr__": lambda x: "missing"})()
+
+class _MissingType:
+ def __repr__(self) -> str:
+ return "missing"
+
+ def __reduce__(self) -> str:
+ return "missing"
+
+
+missing: t.Any = _MissingType()
+"""Special singleton representing missing values for the runtime."""
internal_code: t.MutableSet[CodeType] = set()
+import copy
import pickle
import random
from collections import deque
consume(x)
with pytest.raises(StopIteration):
next(x)
+
+
+@pytest.mark.parametrize("protocol", range(pickle.HIGHEST_PROTOCOL + 1))
+def test_pickle_missing(protocol: int) -> None:
+ """Test that missing can be pickled while remaining a singleton."""
+ assert pickle.loads(pickle.dumps(missing, protocol)) is missing
+
+
+def test_copy_missing() -> None:
+ """Test that missing can be copied while remaining a singleton."""
+ assert copy.copy(missing) is missing