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.0a4.tar.gz (68.8 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.0a4-cp314-cp314-win_amd64.whl (74.6 kB view details)

Uploaded CPython 3.14Windows x86-64

pelutils-4.0.0a4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (106.9 kB view details)

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

pelutils-4.0.0a4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (108.1 kB view details)

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

pelutils-4.0.0a4-cp314-cp314-macosx_11_0_arm64.whl (76.5 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

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

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

pelutils-4.0.0a4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (107.7 kB view details)

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

pelutils-4.0.0a4-cp313-cp313-macosx_11_0_arm64.whl (76.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

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

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

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

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

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

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

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

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

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: pelutils-4.0.0a4.tar.gz
  • Upload date:
  • Size: 68.8 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.0a4.tar.gz
Algorithm Hash digest
SHA256 497e69f4c3017f6bd37ab26dcfb03d8a8304df6e3ab05bf0f43609bf5794c825
MD5 0cbdc9d13b5949a7b086dae8079f0da0
BLAKE2b-256 b3110836c548ef331f3ced4cf3394ddc5f2169a4391c7b23916a3334a2a4d9bd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-4.0.0a4-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 74.6 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.0a4-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 9c445ababcdae7cbacd978eeb8d422a520024d174d4e0b94f85b45dd18e49db3
MD5 53c3e3e822cc06568f9bd55080e1c645
BLAKE2b-256 6b7856818535766b5196d351acd16f6b5593e3563cea31e6d107ee27c301b7e3

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a4-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.0a4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3133e028f484ff6a054fda2a514b8dae7a1abee248fe5df6f09e8ca70d5debbd
MD5 56e3a362fb64f31c48fb1c0e55fba3b8
BLAKE2b-256 dc1dc834e71e905ccec72a3fa45a542cd28e96471ffd29623a60c3b61d87ced1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0e825555be75fa4975f01cba40ec4fbab83094a6af958fa27a2304b35924fa40
MD5 27aa85628ad0f3b3931a5ff1c57918f8
BLAKE2b-256 80e1d5f349886a79f69c003bf63589aaccf2b91c01e374f3078ba61d0331a64d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a4-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b7742c19fa8f9a8a2a49c7d1989fc9ddf12a9f940e9f40ac2dd3552a875792aa
MD5 7df0c459919c39a1acf175353fa9824c
BLAKE2b-256 fb0b12af76d3743d2ec9da3996fa3a30897224db8ae4ccfc45ce37537d24b1d3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-4.0.0a4-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 74.4 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.0a4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ab26414818b174fd236e29c7c4c084e000198d5b1bbd70ddc6b4c50cc8e973af
MD5 7ef06241622ee44704c1594d0136f9b4
BLAKE2b-256 fd08f8678acb0e56e8c3e6f196c610afab6fcd717372d6911fb7915cb8d62118

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a4-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.0a4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 569d4ec9a4ff38ee0edffb7ead1286186a9f0dbb1d4b5d4f7b4290c3dfbb5c18
MD5 760c795e6e9605d6bbb14c7e70e9e798
BLAKE2b-256 98df02d12b7ee8bf637c14bf43f2508510d4595eb122aee80c0dc14dc22f110b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 758f021e3d45e4ecfd60ca48a479dd0d71bf4c9059eb96fa1e3aafc8b74522f3
MD5 5b55ae5f20abef7233f7c453f5fbe383
BLAKE2b-256 ca6e9225a1cd4a45a346ccb03b9bc31f4ce051671d8732bea19af65349709f5c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a4-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a587b53e9b9491da47d0ff92e78be1e4e26b1188bca5af6d5a0c639ac4ad4c6e
MD5 52f865fec1c53236584fa69243c2d6b9
BLAKE2b-256 f71344d871fa052c552fbc2e03adb2fe88d905deca6cdce18ea38d87659912f2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-4.0.0a4-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 74.4 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.0a4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b61f60aca53bc4e723ce8cf7de281cc0b29f6981149f360241de7d733a0517ee
MD5 093b65f2ccb8cc6c49a0f8f2d468c68e
BLAKE2b-256 6940e7c68aa640a4804a1dba52ed0e56efdd81d1383114e29d6d34c9210b1ae2

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a4-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.0a4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 94aa75a4d2d0956575bb26fbdcc52a2cbd38ff8de74a6901bb4ef428166ae655
MD5 702f3c6a93c20cf183ebcf0f8c3860ad
BLAKE2b-256 b3d8c1f9f02b9b1b383f6663f4f118c682d373eee8bbdf59b95b3da76eb97ae9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9d2114fb1c644254039382e2728817eda7fd5db6f408cb301bdf5143aed2e0b0
MD5 926ebfa283bdee6fae24f0a765665837
BLAKE2b-256 b845c5358e869604fd222474da98bba577df9d78ca4d3a528617bdd5f6adad99

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 919abf3282d68c4972b6fad611e4bf273e66a25be66e059313eb9bf0d43c9d35
MD5 4af7b3ce6868d537e3ab51242b0882a0
BLAKE2b-256 7da77be4788ea63933ad7563a2b897a944e44e2a54016e4a2eb2836fcd6b481d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-4.0.0a4-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 74.4 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.0a4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 09c40b35663d0bdd05d53dc026d0dbc929ee9aa6a0b2ab5139dca06d9cc8012a
MD5 ac2add3f51ccc352381f1099f50a39f6
BLAKE2b-256 0c1d38022e3db01c0a10a1a3917199a9833c0cd0af431167f9f830c7e895f7c4

See more details on using hashes here.

File details

Details for the file pelutils-4.0.0a4-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.0a4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e04786a179de478a08a8f68f3fe4fdcb4af46bce7035fa89edfd16de59311294
MD5 bfc38610a75ba76c75114d6bd6fbf8bf
BLAKE2b-256 53d371d329109121dcb9484814520954e0bb092e2e559b8fa0f945a3e0b8ab07

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9d2943b6fb7525726d00199b9b4e27ae74bd0032f4415ac0f45c52bd53896020
MD5 7bb6264566f4c3e6a86349b7940ce634
BLAKE2b-256 f47d49a9c9a72b77274f8face7b79a459e484f6d3c847cb7f9929343c779e715

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-4.0.0a4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7c0dc1d40f1313d010898b220fe3813c5ee190c49b6e913a4bfe08d7cf3ff30f
MD5 aa71c4191aa79ee3229ff366648f6705
BLAKE2b-256 2f1894f4ebed09c66fad47a1bdaf5959305e084f11fa070a0d77baca81fa7a39

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