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")

# If an exeption occurs anywhere in the code inside `log.log_errors`, it is logged with its full, chained stacktrace, then re-raised
with log.log_errors:
    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())

    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. Unlike with np.unique, 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.0a5.tar.gz (68.3 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.0a5-cp314-cp314-win_amd64.whl (74.2 kB view details)

Uploaded CPython 3.14Windows x86-64

pelutils-4.0.0a5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (106.5 kB view details)

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

pelutils-4.0.0a5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (107.7 kB view details)

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

pelutils-4.0.0a5-cp314-cp314-macosx_11_0_arm64.whl (76.1 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

pelutils-4.0.0a5-cp313-cp313-win_amd64.whl (74.0 kB view details)

Uploaded CPython 3.13Windows x86-64

pelutils-4.0.0a5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (106.1 kB view details)

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

pelutils-4.0.0a5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (107.3 kB view details)

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

pelutils-4.0.0a5-cp313-cp313-macosx_11_0_arm64.whl (76.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pelutils-4.0.0a5-cp312-cp312-win_amd64.whl (74.0 kB view details)

Uploaded CPython 3.12Windows x86-64

pelutils-4.0.0a5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (106.1 kB view details)

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

pelutils-4.0.0a5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (107.3 kB view details)

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

pelutils-4.0.0a5-cp312-cp312-macosx_11_0_arm64.whl (76.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pelutils-4.0.0a5-cp311-cp311-win_amd64.whl (74.0 kB view details)

Uploaded CPython 3.11Windows x86-64

pelutils-4.0.0a5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (105.6 kB view details)

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

pelutils-4.0.0a5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (106.9 kB view details)

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

pelutils-4.0.0a5-cp311-cp311-macosx_11_0_arm64.whl (76.1 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: pelutils-4.0.0a5.tar.gz
  • Upload date:
  • Size: 68.3 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.0a5.tar.gz
Algorithm Hash digest
SHA256 225f21fab1d37ba1f972526a48274d63946badc225cbc3cc2743756f4ee71130
MD5 00b8dd4ffcdd2cc641755ba14a809c76
BLAKE2b-256 f4c5b5580c0d20de8a09763e91029db9641e911a06a339c19459e734ffc4ce90

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-4.0.0a5-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 74.2 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.0a5-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 7c5e8716df0f46d54919254db6bc5f9fc58661c94a5094a42f1d30df06c6979c
MD5 8c34afa4e1a29d517128b397a3b90ef1
BLAKE2b-256 5c8e06e22573c498cfdfab7f78caec3c9749ac5942d9ef04f1cb28b98bf41432

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a5-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.0a5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 97b4e44e4dd3d4db54db696934bec287bafa753badd702f9b660aeb38c471d47
MD5 605103960394bd57e5b5a406a1c54184
BLAKE2b-256 59facf05c5bcd723fac1850624db8e7a0fc84d0b8e523d8e721daab719d9f27f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 eb788662d40816d8a1638f009b12b86851d63638e7e40d16bee9b90f142ede26
MD5 19631f33c14b4ba82458deb5f033adde
BLAKE2b-256 385e066f63336fa307c54500fe4af0b264df932414ac60b7cc99c38153649ea6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a5-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7dc9f54ed3afda1f691b6a2923b62073e9f14594c238eef77e08ae84bb2046f0
MD5 f0612f1f325cc89c58fa57679e8892bb
BLAKE2b-256 d082b4053385ed8f819cbaab7bfbd43dccae20c11f2939f69930afd894acb9ce

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-4.0.0a5-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 74.0 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.0a5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 dea029da123d8acd2898ba0363336c62fb5c692be35e237e6cf73c3bbbcf67d9
MD5 00e9894dd05edd9453e95843c76c2fab
BLAKE2b-256 3bb5cdf438ccc42e5c512e299ebd0e16b7874bfaf9fc0fab510dc6a2013f2da5

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a5-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.0a5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 da69dba11851b789eac1a62cddc41f6ff4d7f8343bcd8172fd60f6ffc2bcb7a5
MD5 cda84e3e87896732e9ca97608f63b644
BLAKE2b-256 e271315dd946d652b0012766157b1939b250be4f9126f1c74475eb4ee4a3c864

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 696fa86ddda810fca5e5e253a715b10dfee5da439b04d215effb407e8b4565e7
MD5 3bc55716b174f28707abf56f26c15089
BLAKE2b-256 bc471913e87562ed82d1e1db99423389ec2699b4968b06177ee49939187c2674

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5a33f9f0b11189ab29624e5e489b75ca07da62a73530e04536e2d79b47dfd0c2
MD5 177335a9e778044da0271ce65f3517d5
BLAKE2b-256 5e3b381fca40c0e76bac19f20f0971710d1c63153045dff83368b6156efb495c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-4.0.0a5-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 74.0 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.0a5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d4457fd71e2cf17a0f4bb3a49b4c5ea794af14b09ebdc179d502b8b5a559a9f6
MD5 d4a10c78f4455fb6e5fa3587f2d9b5ea
BLAKE2b-256 4e7b4ac822cce9ac77947aca4508a8d804d70a31860ce82056df8471a61a2994

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a5-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.0a5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9138a523fb6677d62db62e2d6614c1c622d44025297a7d9444adeda449339633
MD5 628a4f70602d1eb446d3c6328f05130f
BLAKE2b-256 76bc0ad4db0b77f3d3a4833ffe231a6b99924d67da61b9df657667730ce109f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 697a6e9cad78fcb603832179ee49bbcd703659e4f88d63b54be4526e94507283
MD5 c4beb9525f5ba7220d8144e300f2703d
BLAKE2b-256 3b3310e512ea2981d0437b7e331334d7176dbd487a86bcd775ed6aa6f28839ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 996453ab8a80ef96ba784d2fb4850f0d06898cbcbffe479263a7e062bc6e3b21
MD5 e181eeab82d1331d76a4789d68089626
BLAKE2b-256 a8517a53f0e8a420b781ed8aed789a9d3036fb13ad0a62f91074328c45ade528

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-4.0.0a5-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 74.0 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.0a5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 61e365b3f8f764fbdc7c49e18db7ce174550fd9f46764f042836801351511436
MD5 a0bbdf74a8543708cc3e38cc569ce698
BLAKE2b-256 dbc040146a958ef78b1cfd33e39a9b60151ea470f95a5b5dd321dfba64520d62

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a5-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.0a5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 52b7476a829aa28cddabe775df1f074e6e912f807d38a66692515ba1eb8a175b
MD5 dbc7b935779917cac5878381ca567c5c
BLAKE2b-256 d30c80c3e05faf08efc9ceed0c9f42de005dc9fce9aa2da5b5b74e42d3f920cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c36845391ab5db3c0e6fe6b35de9d57e53e4b4d7920d37f59827edd3bf48d1dd
MD5 5585f746e2c5585e6e8102b19a98b33e
BLAKE2b-256 a897b1ebf43e4bd96a8ef98519fb5f71f659bfca78699595010cc30a90b9d206

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e7f4caf9388725cf2f5b2c5b30b0a7e48f56e8211cc794e7d76aab9c25cfbc39
MD5 4123cadc342f1ccddf35179731bfac42
BLAKE2b-256 02196d6e45604a43a378ebf1a1891f9e6c94acde6894a70d1dc11546ec877faf

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