Skip to main content

pysafe-pickle

Safe, fast, schema-evolvable Python object graph serialization powered by Rust.

Features

  • Drop-in pickle APIdumps/loads/dump/load with the same signatures
  • Zero arbitrary code execution — no __reduce__ or __setstate__ calls during deserialization
  • Schema versioning — migration hooks for evolving your data models
  • Zero-copy tensor support — NumPy and PyTorch integration
  • Rust-native performance — PyO3 bindings for speed
  • Pickle-compatible streamingPickler/Unpickler classes, PickleBuffer (PEP 574)
  • HMAC integrity — optional tamper detection on serialized data

Installation

pip install pysafe-pickle

For tensor support:

pip install pysafe-pickle[numpy]
pip install pysafe-pickle[torch]
pip install pysafe-pickle[all]

Quick Start

import pygraph

# Serialize
data = {"key": "value", "numbers": [1, 2, 3]}
encoded = pygraph.dumps(data)

# Deserialize
decoded = pygraph.loads(encoded)
assert decoded == data

Schema Evolution

Define versioned dataclasses and register migrations:

from dataclasses import dataclass
import pygraph

@dataclass
class User:
    name: str
    age: int
    email: str = ""
    __pygraph_version__ = 2

@pygraph.migrate(from_version=1, to_version=2, type_name="User")
def migrate_v1_to_v2(state: dict) -> dict:
    """V1 had 'name' + 'age', V2 adds 'email'."""
    state["email"] = ""
    state["__pygraph_version__"] = 2
    return state

How it works

  • Set __pygraph_version__ as a class attribute on your dataclass
  • Register migration functions with @pygraph.migrate(from_version=N, to_version=M, type_name="ClassName")
  • Migration functions receive a dict of the old state and return a dict with the new state
  • Chains of migrations are resolved automatically (e.g., v1 → v2 → v3)

Pickler / Unpickler

Use pickle-compatible streaming classes:

import pygraph
import io

# Streaming dump
buf = io.BytesIO()
pickler = pygraph.Pickler(buf, protocol=5)
pickler.dump({"data": [1, 2, 3]})

# Streaming load
buf.seek(0)
unpickler = pygraph.Unpickler(buf)
result = unpickler.load()

Security

pysafe-pickle never calls __reduce__, __setstate__, or any arbitrary code during deserialization. Only allowlisted types can be loaded.

# Restrict deserialization to specific types
pygraph.loads(data, allowlist={"builtins.dict", "builtins.list"})

Allowlisted types

By default, pysafe-pickle supports:

Type Notes
None, bool, int, float Primitives
str, bytes Strings and binary
list, tuple Sequences
dict Mappings
set, frozenset Sets
dataclasses Any @dataclass instance

Any type not in this list raises UnsafeTypeError unless added to the allowlist.

Integrity verification

key = b"my-secret-key"
encoded = pygraph.dumps(data, hmac_key=key)
decoded = pygraph.loads(encoded, hmac_key=key)  # raises HMACError if tampered

Benchmarks

Run the benchmark suite to compare pysafe-pickle vs pickle:

pytest benchmarks/ -v --benchmark-only

Development

# Install dev tools
pip install -e ".[dev]"

# Build the Rust extension
maturin develop

# Run tests
cargo nextest run
pytest tests/ -v

License

AGPL-3.0-only

Release files for pysafe-pickle 1.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for pysafe-pickle 1.0.1
File Interpreter ABI Platform
pysafe_pickle-1.0.1-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
pysafe_pickle-1.0.1-cp310-abi3-manylinux_2_34_x86_64.whl CPython 3.10 abi3 Linux glibc 2.34+ x86-64 Details
pysafe_pickle-1.0.1-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details

Total release size: 683.8 kB

Release files / pysafe_pickle-1.0.1-cp310-abi3-win_amd64.whl

Download URL pysafe_pickle-1.0.1-cp310-abi3-win_amd64.whl
Size 160.4 kB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
625867b7bb09dd71ac3eebbe6db6cf8466f07937784fec7d8aaf581af91c4e36
BLAKE2b-256 checksum
How to use checksums
86baa71b2f60aabb97a8a0cdbbc0189d99175575ff23c1a3c8b70ba297d4da30
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 13, 2026.

Transparency log

Release files / pysafe_pickle-1.0.1-cp310-abi3-manylinux_2_34_x86_64.whl

Download URL pysafe_pickle-1.0.1-cp310-abi3-manylinux_2_34_x86_64.whl
Size 272.9 kB
Tags CPython 3.10 Linux glibc 2.34+ x86-64 abi3
SHA-256 checksum
How to use checksums
a06dad95fea6856d2aeffdfb4f082ba45b91f6f97167e0e7ccf5b8b58522bcbf
BLAKE2b-256 checksum
How to use checksums
5c85a7d7bcaf67cec9917a3e1026455146d825e4e78a9b9c04ac888ee7f38a66
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 13, 2026.

Transparency log

Release files / pysafe_pickle-1.0.1-cp310-abi3-macosx_11_0_arm64.whl

Download URL pysafe_pickle-1.0.1-cp310-abi3-macosx_11_0_arm64.whl
Size 250.5 kB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
481960bd06a4d31a42071513fbf413338b431db555bac1de4fb38e96dbedd09a
BLAKE2b-256 checksum
How to use checksums
9536eec5c3e3fba89ab5e2a19e185bc058882ac8edc37c86b2b84426544ebd77
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 13, 2026.

Transparency log

Release history Release notifications | RSS feed

1.1.0

3 release files

This release

1.0.1 This release

3 release files

1.0.0

3 release files

0.1.0

6 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page