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.array 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).

Updating and releasing

pelutils uses the master branch as a stable development branch. The release branch contains the latest version on PyPI. New features should be made in feature branches from master that can be merged into master once ready. When a new release is ready, update pelutils/__version__.py and rebase master onto release. Then push a new tag from release named vX.Y.Z.

When new code is merged into master, a number of checks are run. These can be tested locally with the following commands.

# Linting and formatting
ruff format pelutils tests
ruff check pelutils tests
# Type checking
basedpyright pelutils
# Unit tests
python -m pytest tests --cov pelutils
# Build docs
# Once build, open docs/build/html/index.html in your browser to see them
make -C docs html

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.0a3.tar.gz (68.0 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.0a3-cp314-cp314-win_amd64.whl (74.0 kB view details)

Uploaded CPython 3.14Windows x86-64

pelutils-4.0.0a3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (105.7 kB view details)

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

pelutils-4.0.0a3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (106.9 kB view details)

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

pelutils-4.0.0a3-cp314-cp314-macosx_11_0_arm64.whl (75.3 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

pelutils-4.0.0a3-cp313-cp313-win_amd64.whl (73.8 kB view details)

Uploaded CPython 3.13Windows x86-64

pelutils-4.0.0a3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (105.3 kB view details)

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

pelutils-4.0.0a3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (106.5 kB view details)

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

pelutils-4.0.0a3-cp313-cp313-macosx_11_0_arm64.whl (75.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pelutils-4.0.0a3-cp312-cp312-win_amd64.whl (73.8 kB view details)

Uploaded CPython 3.12Windows x86-64

pelutils-4.0.0a3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (105.3 kB view details)

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

pelutils-4.0.0a3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (106.5 kB view details)

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

pelutils-4.0.0a3-cp312-cp312-macosx_11_0_arm64.whl (75.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pelutils-4.0.0a3-cp311-cp311-win_amd64.whl (73.9 kB view details)

Uploaded CPython 3.11Windows x86-64

pelutils-4.0.0a3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (104.8 kB view details)

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

pelutils-4.0.0a3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (106.1 kB view details)

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

pelutils-4.0.0a3-cp311-cp311-macosx_11_0_arm64.whl (75.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for pelutils-4.0.0a3.tar.gz
Algorithm Hash digest
SHA256 9bdccac1add50f3c7b3a898f2571efa22ce128fd3fd7dab2a1a3e7dac2d5b9e9
MD5 63d6893d24666ce0ffc5436fd80c6c12
BLAKE2b-256 ae0670f6c6a954d3a9bb494cc8ed45d8496ae596c72400b9e8052f132adc2fbc

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pelutils-4.0.0a3-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 d069b5cc67a18bc27a3dbd3fe3b8f904f6eb6e21b8d9beb253bcc56592d19731
MD5 ff9266ab1ce122ad19bc83321b417ebc
BLAKE2b-256 f5ad559ca865756f7c09850d1fd0253fd4418aa45882e314c97ee3ddb52bb3b6

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a3-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.0a3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 33ac081c35aad1c8a5da55716291a84886fc69c7c1ead315453f36b809c8f55e
MD5 aa21be83d1191510e308b09334b8b5fc
BLAKE2b-256 fc71f27fabfd923b95de688fb9149b8bddd725b95293dc250d77f333196be8bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 48e986bcdbf8df01d761e71880a9eddb4707bd72999b92d87a93a534129944db
MD5 b0c112afddfb511c636722c6e072d047
BLAKE2b-256 cb1c5d0f412e836b822b0bb8543ec1d6bad5a563a36e3f69d91f7879d20487c7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a3-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a25c8623b08f2bd16c76dc9fd0459db94b1df4ec6f5a08fc85f79017340d9222
MD5 a7eaf9fe4e6c52f7769d1538d842dad7
BLAKE2b-256 153a559db26983b17441c41fd6e12d462c54242bc5c701041eadd4087a5982a4

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pelutils-4.0.0a3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 2b2664d6cc68867cb48c8c6bb33bc06208dbfabe89b5998c22ff51da01a9758a
MD5 82bd27e619aa561f849e9e5ea08cc714
BLAKE2b-256 deb0e8b0cac9edc166b78d20a7188156722f31f0fee5d362f7a25ba7fcd1f19c

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a3-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.0a3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8cf4ede09efbd6d7ccbcb015588f1c062e890dccac6e68c2089a17cc2288054f
MD5 7a730989dec5bda5c0d06d3b44663647
BLAKE2b-256 f51e5a5bdc47d2c4ec50a29be56b70a93db3d3008599ebd79a17f6f13c783810

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5c847b1818eb8371b275faef6da91dad013061e111c07efcb3e76be22ffba7bb
MD5 c9c63f06bc1ad576fdc5a71f8bc28f71
BLAKE2b-256 c18b64a562842c6d9b4fe01f8d02d2ec5a0309b0b8048051dc1b4e6c3f7d2cf1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8831c776b6e97826c532e44d89672412ac728fc49c3c93268982e455497c718e
MD5 129a66517331479af502a12de644c740
BLAKE2b-256 f5ad8a138d70d00a372ae0988c0f692804011cd37ae32a0ffbbe403076e55cf7

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pelutils-4.0.0a3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 060c152bcfbecddd852f4c5dfcdf5454e6fa67701be40c24433a0fe63a5a45ba
MD5 0f1abef145d8f2b5bb9ec0936899c4f5
BLAKE2b-256 05d915216e711e415fc226d393d8a4137accc768b6837af9d21e5bf8489570d1

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a3-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.0a3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e9a038a39f9f1c56c33353ed4bad1160c2889800cdfa54c1528c71c86c9372f3
MD5 682c3cfc925ad826877ec96610cd72d3
BLAKE2b-256 bcb2c72eaab02fa94070fe8f3af88babce12aa7503b0f02bcbf861741ebdd469

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5bc75009c71762b857bab726b6115fcf0869e98396b72edc0e865a957ab736e0
MD5 92d94168bee9bf3c59eb18c75db63a27
BLAKE2b-256 adc62bc58ef7521563d133abaad065584b17121007421c54113750c97b066ef6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6c43c4cf67cd85f39316c3b581296ffbc93ae9cc415588b9b47e49ff1cb49869
MD5 20704a5899b345fb39910b67c7951e05
BLAKE2b-256 7db0612ad4ffb562c5f0cf8a81ea46e50f0b8addf50a766cd617253723246c00

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pelutils-4.0.0a3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 6b42e3047b3c645ea8216fc036d481cd5caf72e8c428d01d5ced5ce3a7d14823
MD5 045dad029b406cdef4fcf5fb0cba65ed
BLAKE2b-256 f2edfa0b9cd713175c75665bba15f3d8a331c6afc4a2205f93bf6688bb2450c4

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a3-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.0a3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9ee23b1870e4662e90b1f823c93818c39528a2dfdcd358518afc69c9dc5f014c
MD5 4c6890fba1d98bf323df7d41b5bafcdf
BLAKE2b-256 f07739ce46cb24ae2d2cf94782cc04cfd4de2d92f13dc006d84476eddc38d8ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 99e442bb1e0781ee1997d45353ef2c9b740ec692a9bf2df3e4cd65efb7ca01b7
MD5 0159a8079cd6b3ebf0cb70c927d55dce
BLAKE2b-256 3caf239e75ae2b6f085492dc953fb484d3cf0c3c8c3dd8018e6a12e117d877ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8e1796c21f5fbe701b1a513cf204f8b8ed9eb551f19964fad81811a154a97a2c
MD5 e74d14d0af868114bb07ab4787370f5f
BLAKE2b-256 f5ed045209dcc1a6ebfc51354d855ebfffa5fa638c6f9073115691dd695b8ae3

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