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.0.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.0-cp314-cp314-win_amd64.whl (74.2 kB view details)

Uploaded CPython 3.14Windows x86-64

pelutils-4.0.0-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.0-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.0-cp314-cp314-macosx_11_0_arm64.whl (76.1 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

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

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

pelutils-4.0.0-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.0-cp313-cp313-macosx_11_0_arm64.whl (76.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

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

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

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

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

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

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

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

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

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: pelutils-4.0.0.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.0.tar.gz
Algorithm Hash digest
SHA256 3a0304c09166cb4dbea3c9622cfdaf4a9060851a93aef9c6aacbb972f7ad84d4
MD5 6ca7b876c659a2bc4b4657f3f5c93de5
BLAKE2b-256 64f9d60d3949f520831e0b1dfb3b60b9e1cc45500138f4b1d00317a4498f7669

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-4.0.0-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.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 c16c7c304a6bb02dcf2f5fba221b19dcb08e3d69d19e494816a483c32a66de64
MD5 a404b6e6c22bb6db6da87cd3f6f63e97
BLAKE2b-256 6500c2cb57bcf673ec52119d5375944202a2b4d8709b4302052669b233b34a61

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0-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.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 99e98e180579b26bbdbff58c7033aa90c004ccc91ad616a5f96ac2216dfd5af1
MD5 2227e001386b9a70250fd13c085cd624
BLAKE2b-256 ffc09126c8a9720296060327a8465873396e1fa7f97431bf684c8ebbfd907ce4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0b3a9d5aa355c30a378439019b02b8c32514bd460bb3dcb37e7c23c89b284b11
MD5 68c0139e085e430bd17a6a5ed66dd0a2
BLAKE2b-256 f7319bafdf391b408590010396dd9982d0152f786dbfc63c4945405e8cdffcf0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ea169064a379a85b754483883cd1f0328171f948f77857d2f6ae35ba581bb54b
MD5 876f2d061d2a8904b1b6a586025c70a8
BLAKE2b-256 09b495ebe85e890c8bf24650d8bc267ca48a76c8789565b15d9f86f2bfe7490d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-4.0.0-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.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 5d9a629d84b7f2dea57a4249dc9e63bf67bb4f8a64e5d9f1461ad99e9794aabc
MD5 0dff3c66b687a3b6ff8abc62c9075334
BLAKE2b-256 e80229bfa4d1ed6ea62dee6cc19a31b9c2f5b61d0c6ccadcb49d6ddc8fe7baa6

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0-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.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 445b0f5604c92f5490cb34488cc25df5a1866c9bfbf14d16ece7b120f7be69a5
MD5 12170bfa7037802668497f513c8a4578
BLAKE2b-256 e05613ee8d4df6119f063dcd9572cf997027c93041900d1823ea33588aad7912

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f5cd28661bb932460248cc89e41bc5b51135b98d82100cbea1ab055f8b3810dd
MD5 690abd56c13beb970ccecb980fc7210b
BLAKE2b-256 46f3f592f0b2ec32db1f0438053dd4ef9585e4f811175c5b505cdc7a572d0bb8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 00b4fa51c2b74dccd70abcf3c3e10d37df51bac24aebcd70380f5da16e83b44b
MD5 bbef5cb33f4591155c50ba32aef5ab29
BLAKE2b-256 378b5f5e8abb68a6a49bf3e2b0509bd00bc0588077dc00145cc88684d5fb7541

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-4.0.0-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.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 5a0cb52655a824b98ec811581a4db59901f6bfbe436e09dffb1a3f20c5da9004
MD5 b2c457fb934c0464df02325293626112
BLAKE2b-256 8558ad0615046cb7f3c92f3cf16b3555d88b52bc0cc0716121a541752bcf2983

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0-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.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2fcc43c8ca3d8b4691616d58c04e52336969c57af45706a881a556e289e3226d
MD5 85590a1d1a5a7953d60641e6d2831786
BLAKE2b-256 94d725af032de832652a82aa50843a76d6ff15b98b42b4ce0d937b80563a2c3d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c3d38dc84c595de182175f00372c609f0a6c7cb607385027bdff78985808acf5
MD5 218a598818c0765381b0bbd61d685d41
BLAKE2b-256 c5bc46129811601bc0775e9b40267ae80285ebce4139908823f6a0f4cdbb892f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b3b65f89b5cf8852fd7841998439993526a522622db94827a57ef58c4b05befa
MD5 7931b1ba9347f714ddb90f7231ea29ee
BLAKE2b-256 85f6fe5bfdee1e734cddba6ca115d78ee2bb45fd175d775ded6331340a74ddb0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-4.0.0-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.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a2912b0cdb4c2de8d4926860ab82491a67549ba0852ba50095f499aee1db6e10
MD5 5896758f80a04d36bb51cf9f4b3190fe
BLAKE2b-256 b264b1998a50d207fb73d81c035eaafcc7fd1ef9a25345d846726a7e78ab1ca3

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0-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.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a81b2ea4387f4c4499db5d674612e85aa17fe33bce8fe0e0598042ebb0709935
MD5 f196dd5fdef0ca5128e3c68fe7dbc5d8
BLAKE2b-256 6f45e533e46a5d5c19a0cb81639559b9ebc462acd1d3e1f754c76380ebaeb253

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 84e2da789158b548657b0e60a88de1fddf53b3b29599218c2926019a7b66cf09
MD5 b15465dc154bd263b06d6a1381533b97
BLAKE2b-256 976416487c1eacdd4bcc9196a9672847f690a5d7599f76621a632df04fe4d34f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2d8afff207cb7fc4dc5a592d077027a371bc041b20dab70b1e6cd5be7fc2ee7f
MD5 c4c5dc1cfd96a80e7987f0855c17deab
BLAKE2b-256 cdcfb96a50b0fe85179d52244f38b203bc0df425244b2ae6b00b00e609c72515

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