Skip to main content

The Swiss army knife of Python projects

Project description

pelutils

Ruff basedpyright checks Coverage Status PyPi Python versions image readthedocs

The Swiss army knife of Python projects

Every project, experiment, or one-off script inevitably ends up reinventing much of the same plumbing: some way to time a loop, saving and loading data to and from disk in a convenient and human-readable manner, a decent logger, parsing a config file, a readable table. pelutils bundles the good versions of these so you can get straight to the actual work. It has no required dependencies beyond the scientific-Python staples, ships type hints (including py.typed), and is easy to start using.

📖 Full documentation: pelutils.readthedocs.io

Highlights

  • Logger — easy-to-use, colourful console output, log files with rotation, automatic stacktrace capture, and safe logging from multiple processes.
  • Timer & profiler — a Matlab-style tick/tock timer and a near-zero-overhead profiler that prints a readable breakdown of where your time goes.
  • UniversalJsonModel — a pydantic.BaseModel that can save any attribute to a human-readable JSON file (numpy arrays, tensors, and other unserialisable types are pickled transparently) and load it straight back.
  • JobParser — one parser that unifies command-line arguments and config files, with support for running many jobs from a single config and auto-documenting them.
  • unique — a linear-time drop-in for numpy.unique, dramatically faster on large arrays (backed by a small C extension).
  • Data-science helpers — a matplotlib Figure context manager with improved default settings over matplotlib, histogram binning, reparametrised scipy distributions, z_score, LaTeX-ready tables, and numpy type aliases.

Installation

pip install pelutils

pelutils supports Python 3.11+. A small subset of functionality can additionally make use of PyTorch, which must be installed separately.

Importing: every feature lives in its own submodule and must be imported from there — e.g. from pelutils.logging import log. Only __version__ is exported at the top level. See the docs for the full API.

Logging

Python's built-in logging is powerful but fiddly to set up, and a bare print gives you no importance levels, no timestamps, and nothing on disk to look at afterwards. This logger hits the sweet spot: one configure call and you get colour-coded, timestamped output to both the console and a log file, with severity levels, log rotation, one-line exception logging, and multiprocessing-safe collection.

from pelutils.logging import log, LogLevels

# Set up the logger by giving it the file to write to
# Omit the path to only print, never write a file
log.configure("train.log")

log.section("Training run")  # Highlighted section header
log(f"Loaded {len(dataset):,} samples")  # Logs at INFO level
for epoch in range(epochs):
    loss = train_one_epoch()
    log.debug(f"Epoch {epoch}: loss {loss:.4f}")  # Logs at DEBUG level - by default, only saved to the log file, but not printed to the console
    if loss > 1e3:
        log.warning("Loss is diverging")  # Logs at WARNING level
log.debug("Final weights", model.state_dict().keys())

# If an exeption occurs in a piece of code, log it with its full (chained) stacktrace, then re-raise
with log.log_errors:
    save_checkpoint(model)

# Temporarily change or silence the log level
with log.level(LogLevels.ERROR):
    log.warning("Suppressed")

# Rotate the log file by time or size
log.configure("train.log", rotation="day")    # or "1 GB", "hour", ...

When using multiprocessing, wrap a worker in with log.collect: so its lines are written together instead of interleaving with other processes. See the logging docs for input helpers, multiple loggers, and more.

Timing and profiling

When you want to know where a script spends its time, cProfile gives you a wall of function-level numbers, and manual time.perf_counter() calls quickly turn into bookkeeping. TickTock sits in between: wrap the sections you care about in named, nestable context managers and print a readable table of totals, hit counts, averages, and each section's share of its parent's time. The per-profile overhead is tiny, so it happily lives inside hot loops and long-running jobs.

from pelutils.ticktock import TT

# Time a single block, Matlab style
TT.tick()
model = train_model(data)
print(f"Training took {TT.tock():.1f} s")

# Profile named sections across a loop, nesting them however you like
for image in images:
    with TT.profile("Process image"):
        with TT.profile("Load"):
            img = load(image)
        with TT.profile("Resize"):
            img = resize(img, (224, 224))
        with TT.profile("Inference"):
            predict(model, img)

# Print a table of hits, total time, and average time for each section
print(TT)

with TT.profile("name", hits=n): records n hits at once, which is handy for very tight loops or for a block that processes n items in parallel. TT.do_at_interval(...) turns the same instance into a throttle for periodic tasks. The default TT is a shared instance; construct your own with TickTock() when you need isolation — most importantly one per thread, as profiling is not thread-safe.

Serialisation

UniversalJsonModel extends pydantic.BaseModel with save/load methods and can serialise attributes that pydantic cannot — numpy arrays, tensors, and arbitrary objects are base64-pickled inline, everything else stays plain, human-readable JSON. Long lists are wrapped to the line-length limit instead of one element per line.

import numpy as np
from pydantic import BaseModel
from pelutils.serialization import UniversalJsonModel
from pelutils.types import FloatArray

class Nested(BaseModel):
    label: str

class Result(UniversalJsonModel):
    accuracy: float
    predictions: FloatArray   # numpy arrays are handled automatically
    meta: Nested

result = Result(
    accuracy=0.97,
    predictions=np.arange(5, dtype=np.float16),
    meta=Nested(label="run-1"),
)

result.save("results/run-1.json")
result = Result.load("results/run-1.json")

Use to_json_dict() / from_json_dict(...) to convert to and from a plain dict without touching the filesystem — useful for nesting inside other structures. The pretty_json helper function is also available on its own. The serialization module also includes JSONL read/write helpers (jsonl_dump, jsonl_load, ...) with largely the same interface as is provided by the built-in json module.

Config and command-line argument parsing

JobParser combines typed command-line options with INI config files. CLI values override config values, which override defaults. Declare RequiredArg for values every job must provide, OptionalArg for values with defaults, and Flag for booleans. Names are --kebab-case on the command line and snake_case attributes on the resulting job.

from pathlib import Path
from pelutils.job_parser import Flag, JobParser, OptionalArg, RequiredArg

parser = JobParser(
    RequiredArg("data-path", help="Training data directory"),
    OptionalArg("learning-rate", default=1e-4, type=float, help="Optimizer learning rate"),
    Flag("fp16", help="Use mixed precision"),
    multiple_jobs=True,
)

for job in parser.parse_jobs():
    print(job.name, job.data_path, job.learning_rate, job.fp16)
    job.write_documentation(Path("runs") / job.name / "arguments.ini")
    # ... run your application with the resolved job values

A single config file can define several named jobs (with a shared [DEFAULT] section), and one CLI override applies to all of them:

python main.py --config-file config.ini --learning-rate 5e-5

For a single job, drop multiple_jobs=True and call parse_job() instead. A config path can target one section directly, e.g. --config-file config.ini:low-lr. See the job parser docs for auto-documentation details.

Fast unique

A linear-time alternative to numpy.unique, significantly faster on large arrays. It also accepts torch tensors and pandas series. The returned elements are unsorted.

import numpy as np
from pelutils.misc import unique

x = np.random.randint(0, 100, size=10_000_000)
values = unique(x)
values, index, inverse, counts = unique(
    x, return_index=True, return_inverse=True, return_counts=True,
)

Data science

Statistics

Common statistical helpers, plus wrappers around scipy distributions reparametrised as in Jim Pitman's Probability (rather than scipy's loc/scale, which are unintuitive for many distributions).

from pelutils.stats import z_score
from pelutils.stats import expon

# 95 % confidence interval half-width for a standard normal (defaults give ~1.96)
half_width = std * z_score()

# One-sided z value for an Exponential(λ=2) at the 1 % significance level
zval = z_score(alpha=0.01, two_sided=False, distribution=expon(lambda_=2))

Plotting

The Figure context manager fixes common matplotlib annoyances — sensible default figure and font sizes, easy styling — and saves and closes the figure for you while restoring rcParams afterwards.

import matplotlib.pyplot as plt
from pelutils.plots import Figure, histogram, normal_binning

with Figure("plot.png", figsize=(20, 10), fontsize=20):
    plt.scatter(x, y, label="Data")
    plt.grid()
    plt.title("Very nice plot")
# Saved to plot.png and closed here

# histogram returns x and y coordinates ready for unpacking
plt.plot(*histogram(data, binning_fn=normal_binning))

Three binning functions are provided — linear_binning, log_binning, and normal_binning (more resolution near the centre of roughly-normal data) — and custom binning functions are supported. See the plotting docs.

Numpy type aliases

Type aliases so you (and your type checker) do not have to track array dtypes by hand.

from pelutils.types import FloatArray, IntArray, BoolArray

def process(features: FloatArray, labels: IntArray, mask: BoolArray): ...

Also included

  • pelutils.misc.Table — build aligned text tables which can also be easily export to LaTeX with Table.to_latex().
  • pelutils.misc.hardware_info / OS — describe the machine the code runs on.
  • pelutils.misc.git_repo_info — the repo and commit the code is executing in.
  • Assorted file and dict helpers (reverse_line_iterator, except_keys, ...).
  • pelutils.tests — pytest helpers: a UnitTestCollection base class with a managed temp directory, and a restore_argv decorator.

Supported platforms

Precompiled wheels are provided for most common platforms (not 32-bit systems). If no wheel matches, pip builds from source which requires <Python.h> — install it with sudo apt install python3-dev (Ubuntu) or sudo dnf install python3-devel (Fedora).

Project details


Release history Release notifications | RSS feed

Download files

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

Source Distribution

pelutils-4.0.0a1.tar.gz (63.1 kB view details)

Uploaded Source

Built Distributions

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

pelutils-4.0.0a1-cp314-cp314-win_amd64.whl (68.1 kB view details)

Uploaded CPython 3.14Windows x86-64

pelutils-4.0.0a1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (86.9 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

pelutils-4.0.0a1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (88.3 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

pelutils-4.0.0a1-cp314-cp314-macosx_11_0_arm64.whl (68.8 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

pelutils-4.0.0a1-cp313-cp313-win_amd64.whl (68.0 kB view details)

Uploaded CPython 3.13Windows x86-64

pelutils-4.0.0a1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (86.8 kB view details)

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

pelutils-4.0.0a1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (88.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

pelutils-4.0.0a1-cp313-cp313-macosx_11_0_arm64.whl (68.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pelutils-4.0.0a1-cp312-cp312-win_amd64.whl (68.0 kB view details)

Uploaded CPython 3.12Windows x86-64

pelutils-4.0.0a1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (86.8 kB view details)

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

pelutils-4.0.0a1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (88.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

pelutils-4.0.0a1-cp312-cp312-macosx_11_0_arm64.whl (68.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pelutils-4.0.0a1-cp311-cp311-win_amd64.whl (68.0 kB view details)

Uploaded CPython 3.11Windows x86-64

pelutils-4.0.0a1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (86.7 kB view details)

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

pelutils-4.0.0a1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (88.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

pelutils-4.0.0a1-cp311-cp311-macosx_11_0_arm64.whl (68.8 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file pelutils-4.0.0a1.tar.gz.

File metadata

  • Download URL: pelutils-4.0.0a1.tar.gz
  • Upload date:
  • Size: 63.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pelutils-4.0.0a1.tar.gz
Algorithm Hash digest
SHA256 1620f12e16129c1dd9cf1c64a93934a9666412e460597b7f016a903f2f2d1b89
MD5 f224f99e05c65a90dd948ca01aaf57d1
BLAKE2b-256 62412292f457a4a9493f2a86ded6fd40837c550b9f2e8d41d883010e35dd9b36

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: pelutils-4.0.0a1-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 68.1 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pelutils-4.0.0a1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 ca1a3c4e98faa17d4fcdd2a90dc3727eef1b0b0e699fdda4467a8f7afe1c3685
MD5 db9c345ccd08f405365b9d128aa88f0e
BLAKE2b-256 2ab876c7d328a5f2789ae270f577aa38d34ac377c272a3da44e02ed95a4504a3

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pelutils-4.0.0a1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 10d1089d910dcf2d51b6c6a4439b633cc5cc2cba3788b885ae0b68d1215da319
MD5 21bf3e850a8d17b8638023e8b2ac535c
BLAKE2b-256 d5946a04c533afc36d766508717872fe265847140febf1e56001fccd66a8ca6a

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pelutils-4.0.0a1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 02dba1c9af022f66fe0d7e2faaf2cc87440cf25a5c17ceed0ce9d5bef5c3c3a4
MD5 4eec50a8a3bb348bf0b916ec2aa8c3eb
BLAKE2b-256 58f976c9d6546c42201061e8c29789e887c4f6a6b20ec3627c3cc455af426b74

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pelutils-4.0.0a1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 551b60ab3caa4a342ecd7bd742a01366b5e7c5ef0ff7c3bab3fce17aa5f558f3
MD5 f338f98efc49ecfe715d0b853a7b1c72
BLAKE2b-256 a45e001b597199dda199ff57651a6e0d56b03cbf949b443d2908b44b8ed6c034

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: pelutils-4.0.0a1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 68.0 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pelutils-4.0.0a1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 bf88dfd3e621e271db5596a0c372e016b4fa1e54abb05fd5ab2a264c43c1afad
MD5 02917698ba084c07befab83797ab4a5b
BLAKE2b-256 749429801985266980b102ae9b63cb27d93c3373b691b4a11dd452f4ac12517e

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pelutils-4.0.0a1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9fa79611f174c61cb76e5d7ee9a3dc48ee84267eb8f0323ba1106b7d0536c366
MD5 38018f622522cba4a8e2521098792379
BLAKE2b-256 dd6a12affb21fef90a93617977b5d65b7747a54fb3c5648ccf7dc46a5faa8e14

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pelutils-4.0.0a1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6e531b3283fe9d52093f52ae9c144e3d368c11d2dbc94c81023d83953a557f03
MD5 27485a42e341b32ae497e1f1f3cb3417
BLAKE2b-256 92e089e41e5b4e29e59b487dee8ded71a3f2e6fb9d02669e5e7b5cbe7463fcbb

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pelutils-4.0.0a1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 175f4e0009672f467888fbb219394bb26f326f0e30210dbb0c53446408989719
MD5 40d5b8e1f21e85e932b815f1245b0c08
BLAKE2b-256 f8e81f6c4d5a65f67b4403e0562537a7d457c791f5831326bbb2bde739cac6f1

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: pelutils-4.0.0a1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 68.0 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pelutils-4.0.0a1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 39d8d9096d22bc0e92d90b7c16020bbdefbb8b175768e155921b24f66d992005
MD5 8aff78ea415d45efa81ccac7a771b03a
BLAKE2b-256 212f08516168c31cb769dbd1e2215d1967fcd57a1ad443109c29730071906d18

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pelutils-4.0.0a1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c21797a3669858f76854b6f0390bf5faa517f5043d47ae945338bfd076db68d8
MD5 4b3807a5e04c4edd0407c2fa83d984f9
BLAKE2b-256 9ca8789e6a558f66809257fa962e9d2ae060e7e78630c87a604dcd3627d20090

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pelutils-4.0.0a1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d367ca7d2740f05137ed7f2648a702cf0663b7c491da1cdd6b1fb370b28d49ba
MD5 4d051538e0f334bb5e8924ceafa8a107
BLAKE2b-256 28d47c6780ded9a71b1c9ac38fcd33b665ffb05285eef4dc5e7a1dd7abeaea85

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pelutils-4.0.0a1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 aee2e5c16364d5da42ad4447fea3987142827a800e16524b88f9c354fdb8eeee
MD5 e344c21281d4de2cc45f45777f7f9d62
BLAKE2b-256 731abd64e3d3964c58484ae3083c9c7076c701465ef8f7e255ebcdccebc34e5d

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: pelutils-4.0.0a1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 68.0 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pelutils-4.0.0a1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 fb37125aa59184a989102527b4d3dac01bbbe28abdd2dc83a2e829d576e191b5
MD5 4aaf7b4f955c1db5be4a4dc5821b29df
BLAKE2b-256 6bb67befa1169293ac37b6b3e0712667bf567d9de584982c5c749dd8d82ca22a

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pelutils-4.0.0a1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 77fb7bb2668d49a43facfa84b880bdca07326e7d4cb009e577e394af41b410c8
MD5 21302f0e7c6bf9265f17d8aa77bea620
BLAKE2b-256 89a231588999a3ff5ec11ed8748ebe9a16b61a4cf48e389469f99cc07005351c

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pelutils-4.0.0a1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c87c090f001ea18e2cc8c698ec4f35426e22f53f8d935440b3dcabd0db9c59e9
MD5 b51ac4a8096936a09a247d3241796c57
BLAKE2b-256 c82a6959e6b56ed156a087b367adf0ad1096e2879c02bac653c079a347ec9b71

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pelutils-4.0.0a1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a32beb7c5f82c3ffb459b30a2cccee0e33966c82b16e8f2d899f047824a4fea2
MD5 0078034470f56e3452ac55c5ba6eb07f
BLAKE2b-256 4ab3e24d1ecc7709ca4b0501a44fdc5526cef4cbb2ce2b26747949135f3825b9

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