Skip to main content

pysafe-pickle

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

Documentation PyPI License

📖 Documentation: https://abdullah-masood-05.github.io/pygraph/

Features

  • Drop-in pickle API — dumps/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 streaming — Pickler/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 pysafe_pickle as psp

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

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

Schema Evolution

Define versioned dataclasses and register migrations:

from dataclasses import dataclass
import pysafe_pickle as psp

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

@psp.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["__pysafe_pickle_version__"] = 2
    return state

How it works

  • Set __pysafe_pickle_version__ as a class attribute on your dataclass (legacy __pygraph_version__ is also fully supported)
  • Register migration functions with @psp.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 pysafe_pickle as psp
import io

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

# Streaming load
buf.seek(0)
unpickler = psp.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
psp.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 = psp.dumps(data, hmac_key=key)
decoded = psp.loads(encoded, hmac_key=key)  # raises HMACError if tampered

Migration from v1.0.x (pygraph)

In v1.0.x, the package was imported as import pygraph. In v1.1.0:

  • The canonical import is now import pysafe_pickle as psp.
  • Zero code breaks: Existing code using import pygraph or from pygraph.migrations import migrate continues working identically via a backward-compatible shim, emitting a FutureWarning.
  • Binary compatibility: Files serialized with v1.0.x (magic PYGR) continue to deserialize seamlessly with zero warnings. New files are encoded with the PSPK magic header.
  • The pygraph shim will remain supported through v1.x and will be removed in v2.0.0.
# Legacy (deprecated in v1.1.0, emits warning, still works)
import pygraph
pygraph.dumps(data)

# Recommended
import pysafe_pickle as psp
psp.dumps(data)

Benchmarks

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

uv run pytest benchmarks/ -v --benchmark-only

Development

# Install and build with uv / maturin
uv run maturin develop

# Run tests
cargo nextest run
uv run pytest tests/ -v

License

AGPL-3.0-only

Metadata

Release files for pysafe-pickle 1.2.0

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.2.0
File Interpreter ABI Platform Actions
pysafe_pickle-1.2.0-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details for pysafe_pickle-1.2.0-cp310-abi3-win_amd64.whl
pysafe_pickle-1.2.0-cp310-abi3-manylinux_2_34_x86_64.whl CPython 3.10 abi3 Linux glibc 2.34+ x86-64 Details for pysafe_pickle-1.2.0-cp310-abi3-manylinux_2_34_x86_64.whl
pysafe_pickle-1.2.0-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details for pysafe_pickle-1.2.0-cp310-abi3-macosx_11_0_arm64.whl

Total release size: 715.6 kB

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

Download URL pysafe_pickle-1.2.0-cp310-abi3-win_amd64.whl
Size 172.2 kB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
e86e34158dfae96e1f34dc634c2fc2b7673bee695c1f1cd7fb3732139a915a2f
BLAKE2b-256 checksum
How to use checksums
632d9470d88850f2536b7706bdd107da8e6591e892af84e8d8b72a0cfd2125e9
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 23, 2026.

Transparency log

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

Download URL pysafe_pickle-1.2.0-cp310-abi3-manylinux_2_34_x86_64.whl
Size 283.5 kB
Tags CPython 3.10 Linux glibc 2.34+ x86-64 abi3
SHA-256 checksum
How to use checksums
25682161831513f7910673d22e045dc44dfbf9a160d2d534780dcaffebc98c95
BLAKE2b-256 checksum
How to use checksums
e72ffb9556e1178f9e6e7d4f45749aa9b7de64417cc176e2759d7b57d687191f
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 23, 2026.

Transparency log

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

Download URL pysafe_pickle-1.2.0-cp310-abi3-macosx_11_0_arm64.whl
Size 259.9 kB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
c519e4bd4da4ab6d555351ef4b0ddc3c008cc51371123a8c841c8786e0e562a4
BLAKE2b-256 checksum
How to use checksums
83befb17966e43050c9e1c8eebbc975a5a8d5069490911a50ec1d55ae2b18859
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 23, 2026.

Transparency log

Security for pysafe-pickle 1.2.0

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.

Full provenance

All 3 files in this release have been uploaded with provenance metadata.

Select from 3 files

Attestation for pysafe_pickle-1.2.0-cp310-abi3-win_amd64.whl

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 23, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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