No Code Execution on Load
Unlike Python's standard pickle, pysafe-pickle never invokes __reduce__, __setstate__, __init__, exec, or eval during deserialization, and never imports a module named in the data. Only a fixed set of types can be rebuilt.
Powered by Rust. No arbitrary code execution on load. Familiar pickle-style API.
None, bool, arbitrary-size int, float, complex, str (including lone surrogates), bytes, bytearray, list, tuple, dict, set, frozenset, datetime/date/time/timedelta/timezone, ZoneInfo, Decimal, UUID, Fraction, range, slice, Ellipsis, NotImplemented, pathlib paths, OrderedDict, defaultdict (builtin factories), Counter, deque, @dataclass instances, namedtuples and Enum members. Anything else raises UnsafeTypeError: Unsupported type.
import datetime as dt
from dataclasses import dataclass
import pysafe_pickle as psp
@dataclass
class User:
name: str
joined: dt.date
email: str = ""
# Serialize (and sign) with Rust
data = psp.dumps(User("Alice", dt.date(2026, 10, 28)), hmac_key=b"secret")
# Verify, then deserialize without running any code from the payload
user = psp.loads(data, hmac_key=b"secret", classes=[User])
print(user) # User(name='Alice', joined=datetime.date(2026, 10, 28), email='')
print(isinstance(user, User)) # Truepysafe-pickleAbdullah-Masood-05/pygraph