Skip to main content

Maximum performance runtime type enforcement using CPython C API.

Project description

🛡️ Guardian — Sub-Microsecond Runtime Type Enforcement & Access Control for Python

Guardian is a blazing-fast runtime type enforcer and data validation framework for Python 3.11+.

Unlike traditional Python validation libraries that rely on slow dictionary wrappers, getattr proxies, or dict parsing, Guardian is written entirely as a native C-extension. It intercepts assignments directly at the memory level via the CPython API, delivering O(1) validation that outperforms industry standards like Pydantic (Rust) and Beartype.


🚀 Performance Benchmarks

Guardian is engineered for high-throughput backend APIs and data pipelines where nanosecond performance matters.
(Benchmarks run for 100,000 iterations against standard Python 3.13)

Operation / Library Time (ns / op) Relative Speed
Standard Python Function 30.61 ns 1.00x
@guard Function 80.79 ns 2.64x
Beartype Function 241.10 ns 7.88x
Standard / shield Init 653.75 ns N/A
Pydantic v2 Init (Rust) 824.64 ns N/A
shield Attribute Set 76.26 ns N/A
Pydantic v2 Attribute Set 194.05 ns N/A

Highlights

  • Function decorators: @guard is ~3× faster than Beartype
  • Class models: shield is ~2.5× faster than Pydantic v2 at attribute assignment

📦 Installation

Guardian distributes pre-compiled wheels for Linux, macOS, and Windows.

pip install guardian-type-enforcer

🛠️ Core Features

1. shield (C-Native Data Models)

The shield class is a high-performance alternative to @dataclass or pydantic.BaseModel.
By inheriting from shield, your class becomes a native C-type (ShieldBase). It enforces strict typing on all annotated attributes and provides true protected/private access control.

from guardian.shield import Shield
from guardian._guardian_core import GuardianTypeError, GuardianAccessError


class User(Shield):
  username: str
  age: int
  _internal_id: int  # Attributes starting with '_' are private

  def __init__(self, username: str, age: int):
    self.username = username
    self.age = age
    self._internal_id = 9999


# --- 1. Type Enforcement ---
user = User("Michex", 25)

user.age = 26  # OK
user.age = "twenty"  # ❌ Raises GuardianTypeError

# --- 2. True Private Access Control ---
print(user._internal_id)  # ❌ Raises GuardianAccessError

How it works:
shield bypasses Python’s __setattr__. Memory assignment and type-checking happen directly in C via tp_setattro slots, taking less than 80 nanoseconds. Internal access is verified by walking the CPython frame stack to ensure the caller context owns the self pointer.


2. @guard (Boundary Type Enforcement)

Use @guard to enforce strict input and return types on your critical functions, API endpoints, or calculations.
Supports deeply nested types like dict[str, list[int | float]].

from typing import Union
from guardian import guard


@guard
def process_sensor_data(payload: dict[str, list[Union[int, float]]]) -> bool:
  return True


# Valid payload
process_sensor_data({"sensor_A": [1, 2.5, 3]})

# Invalid payload
process_sensor_data({"sensor_A": [1, 2.5, "3.0"]})
# ❌ Raises GuardianTypeError

# ignore return
@guard(check_return=False)
def process_data(payload: list[int | str]) -> int:
  return True

process_data([1, "2"])
# ✅ successful 

How it works:
Signatures are compiled into C-structs at import time. During runtime, validation is O(1) positional mapped natively in C via the vectorcall protocol (PEP 590).


3. @deepguard (Local State Profiling)

While @guard checks inputs and outputs, @deepguard acts as a rigorous state machine enforcer. It ensures that local variables inside your function never mutate into unexpected types during execution.

from guardian import deepguard

@deepguard
def calculate_discount(price: float) -> float:
    discount: float = 0.0
    
    if price < 0:
        discount = "N/A"  # ❌ Raises GuardianTypeError when returning
        
    return price - discount

Note:
@deepguard utilizes PyEval_SetProfile to intercept the local dictionary state upon function return. Because it hooks into interpreter profiling, it carries a ~43µs overhead and should be reserved for high-stakes business logic.

Because of its deep tracing nature, deepguard incurs performance overhead and is best utilized as a strict development, debugging, or auditing tool rather than in high-performance production loops.


🧠 Advanced Usage: The Compiler

Guardian automatically compiles complex type hints into flat, recursive integer tuples that the C-core switch statements can evaluate instantly.

Supported types include:

  • Primitives (int, str, float, bool)
  • Data structures (list, dict, set, tuple)
  • Typing constructs (Union, Optional, Any, Literal)
  • Deeply nested configurations (dict[str, tuple[int, ...]])

Primitives use branch-predicted fast paths (PyLong_CheckExact, PyUnicode_CheckExact) to skip isinstance() overhead entirely.


🤝 Contributing

Contributions, issues, and feature requests are welcome.

git clone https://github.com/yourusername/guardian-type-enforcer.git
pip install -e .
pytest tests/test.py -v

📄 License

This project is licensed under the MIT License.
See the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

guardian_type_enforcer-3.1.2-cp313-cp313-win_amd64.whl (16.6 kB view details)

Uploaded CPython 3.13Windows x86-64

guardian_type_enforcer-3.1.2-cp313-cp313-win32.whl (15.9 kB view details)

Uploaded CPython 3.13Windows x86

guardian_type_enforcer-3.1.2-cp313-cp313-musllinux_1_2_x86_64.whl (33.9 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

guardian_type_enforcer-3.1.2-cp313-cp313-musllinux_1_2_i686.whl (32.7 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ i686

guardian_type_enforcer-3.1.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (34.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

guardian_type_enforcer-3.1.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (32.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

guardian_type_enforcer-3.1.2-cp313-cp313-macosx_11_0_arm64.whl (15.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

guardian_type_enforcer-3.1.2-cp313-cp313-macosx_10_13_x86_64.whl (14.4 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

guardian_type_enforcer-3.1.2-cp312-cp312-win_amd64.whl (16.6 kB view details)

Uploaded CPython 3.12Windows x86-64

guardian_type_enforcer-3.1.2-cp312-cp312-win32.whl (15.9 kB view details)

Uploaded CPython 3.12Windows x86

guardian_type_enforcer-3.1.2-cp312-cp312-musllinux_1_2_x86_64.whl (33.7 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

guardian_type_enforcer-3.1.2-cp312-cp312-musllinux_1_2_i686.whl (32.5 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ i686

guardian_type_enforcer-3.1.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (34.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

guardian_type_enforcer-3.1.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (32.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

guardian_type_enforcer-3.1.2-cp312-cp312-macosx_11_0_arm64.whl (15.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

guardian_type_enforcer-3.1.2-cp312-cp312-macosx_10_13_x86_64.whl (14.4 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

guardian_type_enforcer-3.1.2-cp311-cp311-win_amd64.whl (16.5 kB view details)

Uploaded CPython 3.11Windows x86-64

guardian_type_enforcer-3.1.2-cp311-cp311-win32.whl (15.8 kB view details)

Uploaded CPython 3.11Windows x86

guardian_type_enforcer-3.1.2-cp311-cp311-musllinux_1_2_x86_64.whl (31.6 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

guardian_type_enforcer-3.1.2-cp311-cp311-musllinux_1_2_i686.whl (30.7 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ i686

guardian_type_enforcer-3.1.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (32.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

guardian_type_enforcer-3.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (30.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

guardian_type_enforcer-3.1.2-cp311-cp311-macosx_11_0_arm64.whl (15.1 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

guardian_type_enforcer-3.1.2-cp311-cp311-macosx_10_9_x86_64.whl (14.3 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

Details for the file guardian_type_enforcer-3.1.2-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 69d503da545514f199fc08716da8fa7a471e2da653df0a171ab23de5d2369628
MD5 90d5b3b792efa78288ccf9cf6af27dc8
BLAKE2b-256 7ebb999e09cc130a56a3041be196f3a501d9d994a9fa3f3a797b1934a4d66659

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp313-cp313-win32.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 53ccf70c2eb69881702f985c04e643f3c3d6c00f75e1b6b73aca131728f6f3ba
MD5 2c968628211dc89063230cff5990faa3
BLAKE2b-256 6cf6fc734efccbab9430500068b653e8cc2a5a3cd5e8e96fc1d5f8a8439c220b

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c27c5fffe23250061cd53390feb89232a964351a0f15cf4c4a0e7eb75e048862
MD5 6cf650f00ea1477ce134ad94a2933e33
BLAKE2b-256 7580b922e0b85f6c803bf8fccb0e7d89fd60e57b41080089e350235a7333432b

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp313-cp313-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 8a47b34c954d6f2787e4805ed52aee67cb4f2eb4dd6f256c8b33213df9d41b5f
MD5 23dc5499d402c7bc055c68ae6158b689
BLAKE2b-256 b20d92ecc499e89389501f36222f0ef72b518d6add1987aca638b5a8d70dde38

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a38b44eb0e83a989e5becb09405dec0e5eba3c25295be36cc33e15390908e931
MD5 014d617ad8823f18cd05808595e0fb8e
BLAKE2b-256 582b1be097b315915fadc8345aa694d57ef1ffa189d8e56d642294f86e7ed936

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 f946dae5bd5c1c5b8184f10e44a4978e6e6c6415da002834167cb9cba3b8969e
MD5 d2acf11d23c36b488b9ba82f364af57e
BLAKE2b-256 3c96030d8a3ce5049e29ee13f43d28c1f7e55495b4a3044f3c6f34fbb9162aa5

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e8019153cd4eecc045fd00bf537aec8fa7d17490e24652e6cdfce31f8cea4827
MD5 8ed270a2e6429bccfd6578b3d59ecd18
BLAKE2b-256 a03a53de7f61ff32db70bc135ba380cba56a158101af4c60a5c8907e8aa73fe8

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 841320d0dcc539de97bf22df4d720b73834316020335c93250166aab30c4f605
MD5 fb41efe82dd1d3484bc814c87cdae155
BLAKE2b-256 b221bf87fc54c3e8a07c705462f02f4b70af2b93751a9da8e4c22e861dd4611f

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 83c2e4dbad7a9d997cc8f2980213d50556cc82862971b1974cfc389bb3cd1bb0
MD5 6d74b1b44d16f3d1e311e79c27b1e353
BLAKE2b-256 c58aa46b28df005b42ed9e307feb40ef99e226e23cbf4c0112a141be17d91ea9

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp312-cp312-win32.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 521460782b043e8de1db868a6515ef3aa68d9e84d270e4d953d5f98722184584
MD5 b0c5b8b325e2cb4fd4766fac2b4537da
BLAKE2b-256 c0bdd1cb77b3412fb04aa9de66870dbf3c18b86f476c2b3ed77574830f47b657

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 dadaee64062667afeaeeaf74719d195c486a0096dfb2bbea5120658ac42a213c
MD5 06c9a5295f1d0d213031f0cda0b5fb66
BLAKE2b-256 5d056cb1f6cbcd8f2bab1b0630966a5fe9b08cace983cf43c7efdee14fdbd0f3

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 95ca8e51d39ea601cae53369a993c53e796a0589906672bbd9a1494877d373b3
MD5 6900d7dc866541bc9abbb497e3211c0f
BLAKE2b-256 646828a04a5baf6cfc4394daf108f807b2c3687781d924b2ebf8d2c07472739e

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 575288073458ea41e96199bcfc8712c0fec0bd95dcb8a27967d7cea175c38f37
MD5 6c294c6818b1b67c2ae26710aeb88259
BLAKE2b-256 0e0dacb05128e3c75ac5f70176e47fe3991945541d141d4385aa696f17d80cd7

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 d02f8ebf5b993510f553cc9299ba55a47089530e43594a59329ad968600f721f
MD5 176065321b4ba78c7695baf789854f54
BLAKE2b-256 7972b17d3c434bc3ef04d54106dd492f3c16eb33bae4772608d4b8b1c05e4c21

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6b25e196eb80e7dd347ef6dbbfe0c92d643282c55ecb8b6df09bbc65212771f0
MD5 5bca6e6a925f8e506251ab2707133a1a
BLAKE2b-256 f4501c1dad86f04af4e23d3a5f7c3f689c5253b439da88d7d294232b0720d398

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 48e1f68b5a9766e201cb5ac7e6dac40f368fb74d297bd32942e9eb09fb9ad459
MD5 0facb7d52cce7db6d40b3b11c490393c
BLAKE2b-256 d06cf14d2719cee03b7ec4b1041d6e40aabe05f9087dc1f939f784824ae61e4a

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 fe9d984f836b3e139ceb1f8348b300945ce3ef1e727e5ba992911d3c5459a70e
MD5 528ee61cdb407b21f542e4abd39e43aa
BLAKE2b-256 70cb6ef935459722c493ac88fc911418c860e1298c6a376d78f0e149355350fb

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp311-cp311-win32.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 208fac3df0e74f6fdd81e499aeb2dbfb387fd799f7a04d729cd139289cdcbfcd
MD5 aadfd44d9ba0c215fed84d4d62f1180e
BLAKE2b-256 07d12911e3f69087f474acbedc778ef2edd554cfde91a2cae34ae01f664e517f

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 8d22d0df4d35718f4b9fa7853ab017ac0bc56128bdafd2ff0768d9646689ef9c
MD5 903dabd4297bfb4879fbfaa9c1467d8c
BLAKE2b-256 7e3e42d950576b99f23863fe9abed67753d096d0a114ea24ef1f586a6af5c08b

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp311-cp311-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp311-cp311-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 fa7adfb634df924da99ebfda4cff338fb905199bc07a72452287d416906f0129
MD5 919ae6fd0dafa8e82115f6f55b371dbf
BLAKE2b-256 065a1b2f3ee524049d09e51562aedc2c13571e575981cd4888a1b02144c99286

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 59cc7e36806b4e3ff1ef0376e459607506d4e9d7246fd23b93cfa30e8e21f1c8
MD5 00ec915af6df01ba2e7257eabc6ff952
BLAKE2b-256 b4a0a18c07d0e7351341a4b9467a89f952f7b788f8f89fe74a2db059bebfe403

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 fa801884166b706c44196b930b5b97556b45e7b112178999bb300abb6b2b0855
MD5 35d9b5246d6c0e25c59cf6c80ab3106b
BLAKE2b-256 e092e4f7875612583292d06350d6711ae783335ccd7167cddb89cbfc2ac2c757

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9a0111a669b3a5b8a057c86f12b16c159f53faa2ff25d9d4ceaa4c77253bd6c4
MD5 80281d915096cdbe3cefc9ecf089e72d
BLAKE2b-256 89d411839c4302873f98d28981cbf22cef024569db518c3c49ca0821d360a9fa

See more details on using hashes here.

File details

Details for the file guardian_type_enforcer-3.1.2-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for guardian_type_enforcer-3.1.2-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 13b03d508d5544aea1bdfd05e1e050f36e5ebd5ca18a387ff999c22fd7e5173b
MD5 0d4046da75b0fc95342a6a395823eaf0
BLAKE2b-256 b190418aac20973eac088d9a1e7187f48f6d4e5cd0030e92fe62c45eadc46081

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page