Skip to main content

The Swiss army knife of Python projects.

Project description

pelutils

Ruff basedpyright checks Coverage Status PyPi Python versions image

The Swiss army knife of Python projects.

  • A simple and powerful logger with colourful printing, stacktraces, and log file rotation.
  • Argument parser which supports both command line arguments and config files and has baked-in auto-documentation.
  • A simple timer inspired by Matlab's tic and toc.
  • Easy-to-use, near-zero cost performance profiler.
  • An extension to pydantic.BaseModel with support for saving any data structure to, and loading from, a human-readable JSON file.
  • Table formatting with built-in LaTeX support.
  • Miscellaneous standalone functions - see pelutils/__init__.py.
  • Data-science submodule with extra utilities for statistics, plotting with matplotlib, and machine learning using PyTorch.
  • unique function in the style of numpy.unique which runs in linear time, making it significantly faster for large arrays.

pelutils supports Python 3.9+.

To install, simply run pip install pelutils. A small subset of the functionality requires PyTorch, which has to be installed separately.

Timing and Code Profiling

Simple time taker inspired by Matlab Tic, Toc, which also has profiling tooling.

from pelutils import TT, TickTock

# Time a task
TT.tick()
<some task>
seconds_used = TT.tock()

# Profile a for loop
for i in range(100):
    with TT.profile("Repeated code"):
    <some task>
    with TT.profile("Subtask"):
        <some subtask>
print(TT)  # Print a table view of profiled code sections

# When using multiprocessing, it can be useful to simulate multiple hits of the same profile
with mp.Pool() as p, TT.profile("Processing 100 items on multiple threads", hits=100):
    p.map(100 items)
# Similar for very quick loops
a = 0
with TT.profile("Adding 1 to a", hits=100):
    for _ in range(100):
        a += 1

# To use the TickTock instance as a timer to trigger events, do
while True:
    if TT.do_at_interval(60, "task1"):  # Do task 1 every 60 seconds
        <task 1>
    if TT.do_at_interval(30, "task2"):  # Do task 2 every 30 seconds
        <task 2>
    time.sleep(0.01)

Data Serialisation

The DataStorage2 class is an extension of pydantic.BaseModel which adds convenient safe and load methods for trivial saving to and loading from JSON files. It can serialise any attribute on the model to JSON by pickling types which pydantic cannot natively serialise. To get use it, simply inherit from DataStorage2, like you would inherit from BaseModel.

The produced JSON files take advantage of pelutils.pretty_json(...) to ensure good and human-readable formatting, almost no matter the data types. Very long lists utilise the full allowed line length before splitting. This prevents the common JSON issue of having either very long lines (no indents) or excessively many lines with a single, small element on each.

It is possible to get only the serialised JSON objects as dicts instead of saving them directly to a file with the DataStorage2.model_safe_dump() method. This is practical if you want to nest the objects into another dict or list. DataStorage2.model_safe_load(...) does the inverse operation by creating a class instance from a JSON-serialised dict.

Because the class inherits from pydantic.BaseModel, type checking is built directly into it.

class BasederClass(BaseModel):
    based_string: str

# Define the structure
class BasedClass(DataStorage2):
    nice: float
    long_tuple_of_ints: tuple[int, ...]
    array: FloatArray
    baseder: BasederClass

# Create an instance
based = BasedClass(
    nice=69.69,
    long_tuple_of_ints=tuple(range(500)),
    array=np.arange(5, dtype=np.float16),
    baseder=BasederClass(based_string="Hello there")
)
# Save it to a file
based.save("directory/to/save/in")

# Load it again
based = BasedClass.load("directory/to/save/in")

This will produce directory/to/save/in/BasedClass.json with the following contents:

{
  "nice": 69.69,
  "long_tuple_of_ints": [
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
    37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,
    104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
    131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157,
    158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184,
    185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211,
    212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238,
    239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265,
    266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292,
    293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319,
    320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346,
    347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373,
    374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400,
    401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427,
    428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454,
    455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481,
    482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499
  ],
  "array": "__pickled_b64__:numpy.ndarray:gAWVfQAAAAAAAACMEm51bXB5LmNvcmUubnVtZXJpY5SMC19mcm9tYnVmZmVylJOUKJYKAAAAAAAAAAAAADwAQABCAESUjAVudW1weZSMBWR0eXBllJOUjAJmMpSJiIeUUpQoSwOMATyUTk5OSv////9K/////0sAdJRiSwWFlIwBQ5R0lFKULg==",
  "baseder": {"based_string": "Hello there"}
}

Config and Command-line Argument Parsing

Python has built-in support for both config files (the ArgumentParser and ConfigParser, respectively), but nothing for parsing both. The Pelutils Parser supports both, while also allowing for much stricter checking of types and presence of arguments. It is useful for any application relying on config files where one may want to overwrite certain arguments from the command-line. It's prime usecase, though, is for development of parametric algorithms, such as machine learning engineering.

Consider the execution of a file main.py with the command line call

python main.py path/to/output -c path/to/config/file.ini --data-path path/to/data

The config file could contain

[DEFAULT]
learning-rate=1e-4
fp16

[LOWLR]
learning-rate=1e-5

[NOFP16]
fp16=False

where main.py contains

options = [
    # Mandatory argument with set abbreviation -p
    Argument("data-path", help="Path to where data is located", abbrv"-p"),
    # Optional argument with auto-generated abbreviation -l
    Option("learning-rate", default=1e-5, help="Learning rate to use for gradient descent steps"),
    # Boolean flag with auto-generated abbreviation -f
    Flag("fp16", help="Use mixed precision for training"),
]
parser = Parser(*options, multiple_jobs=True)  # Two jobs are specified in the config file, so multiple_jobs=True
location = parser.location  # Experiments are stored here. In this case path/to/output
job_descriptions = parser.parse_args()
# Run each experiment
for job in job_descriptions:
    # Get the job as a dictionary
    job_dict = job.todict()
    # Clear directory where job is located and put a documentation file there
    job.prepare_directory()
    # Get location of this job as job.location
    run_experiment(job)

This could then by run by python main.py data/my-big-experiment --learning-rate 1e-5 or by python main.py data/my-big-experiment --config cfg.ini or using a combination where CLI args takes precedence: python main.py data/my-big-experiment --config cfg.ini --learning-rate 1e-5 where cfg.ini could contain

Logging

The logging submodule contains a simple yet feature-rich logger which fits common needs. Can be imported from pelutils directly, e.g. from pelutils import log.

from pelutils import log, Logger

# Configure logger for the script
log.configure("path/to/save/log.log")

# Start logging
for i in range(70):  # Nice
    log("Execution %i" % i)

# Sections
log.section("New section in the logfile")

# Adjust logging levels
log.warning("Will be logged")
with log.level(LogLevels.ERROR):  # Only log at ERROR level or above
    log.warning("Will not be logged")
with log.no_log:
    log.section("I will not be logged")

# Rotation
# Start a new log file every hour (or day, month, or year)
log.configure("path/to/save/log.log", rotation="hour")
# Start a new log file when the current one reaches a certain size
log.configure("path/to/save/log.log", rotation="5 MB")

# Error handling
# The zero-division error and stacktrace is logged
with log.log_errors:
    0 / 0
# Entire chained stacktrace is logged
with log.log_errors:
    try:
        0 / 0
    except ZeroDivisionError as e:
        raise ValueError("Denominator must be non-zero") from e

# User input - acts like built-in input but logs both prompt and user input
inp = log.input("Continue [Y/n]? ")
# Parse yes/no user input
cont = log.parse_bool_input(inp, default=True)

# Log all logs from a function at the same time
# This is especially useful when using multiple threads so logging does not get mixed up
def fun():
    with log.collect:
        log("Hello there")
        log("General Kenobi!")
with mp.Pool() as p:
    p.map(fun, args)

# It is also possible to create multiple loggers by importing the Logger class, e.g.
log2 = Logger()
log2.configure("path/to/save/log2.log")

Types

A few different numpy types are defined for the convenience of not having to remember what data types your arrays are - and also to satisfy your nasty type checkers.

from pelutils.types import AnyArray, FloatArray, IntArray


def function_which_takes_np_types(
    any_array: AnyArray,  # np.ndarray with arbitrary data type
    float_array: FloatArray,  # np.ndarray with any floating point data type (e.g. float, np.float16, and np.float64)
    int_array: IntArray,  # np.ndarray with any integer data type (e.g. int, np.uint8, and np.int32)
):
    ...

Data Science

This submodule contains various utility functions for data science, statistics, plotting, and machine learning.

Statistics

Includes various commonly used statistical functions. There are also wrappers around a number of scipy distributions reparametrized as in Jim Pitman's "Probability", instead of using scale and loc, which can be quite unintuitive for many distributions.

from pelutils.ds.stats import z, corr_zi
from pelutils.ds.distributions import expon

# Get one sided z value for exponential(lambda=2) distribution with a significance level of 1 %
zval = z(alpha=0.01, two_sided=False, distribution=expon(2))

# Get correlation, confidence interval, and p value for two vectors
a, b = np.random.randn(100), np.random.randn(100)
r, lower_r, upper_r, p = corr_ci(a, b, alpha=0.01)

Plotting

pelutils provides plotting utilities based on matplotlib. Most notable is the Figure context class, which attempts to remedy some of the common grievances with matplotlib, e.g. having to remember the correct kwargs and rcParams for setting font sizes, legend edge colour etc.

from pelutils.ds.plots import Figure

# The following makes a plot and saves it to `plot.png`.
# The seaborn is style is used for demonstration, but if the `style` argument
# is not given, the default matplotlib style is used.
# The figure and font size are also given for demonstration, but their default
# values are increased compared to matplotlib's default, as these are generally
# too small for finished plots.
with Figure("plot.png", figsize=(20, 10), style="seaborn", fontsize=20):
    plt.scatter(x, y, label="Data")
    plt.grid()
    plt.title("Very nice plot")
# The figure is automatically saved to `plot.png` and closed, such that
# plt.plot can be used again from here.
# Figure changes `matplotlib.rcParams`, but these changes are also undone
# after the end of the `with statement`.

The plotting utilies also include binning functions for creating nice histograms. The histogram function produces bins based on a binning function, of which three are provided:

  • linear_binning: Bins are spaced evenly from the lowest to the largest value of the data.
  • log_binning: Bins are log-spaced from the lowest to the largest value of the data, which is assumed to be positive.
  • normal_binning: Bins are distributed according to the distribution of the data, such there are more bins closer to the center of the data. This is useful if the data somewhat resembles a normal distribution, as the resolution will be the greatest where there is the most data.

It is also possible to provide custom binning functions.

histogram provide both x and y coordinates, making it simple to use with argument unpacking:

import matplotlib.pyplot as plt
import numpy as np
from pelutils.ds.plots import histogram, normal_binning

# Generate normally distributed data
x = np.random.randn(100)
# Plot distribution
plt.plot(*histogram(x, binning_fn=normal_binning))

Finally, different smoothing functions are provided. The two most common are moving_avg and exponential_avg which smooth the data using a moving average and exponential smoothing, respectively.

The double_moving_avg is special in that the number of smoothed data points do not depend on the number of given data points but is instead based on a given number of samples, which allows the resulting smoothed curve to not by jagged as happens with the other smoothing functions. It also has two smoothness parameters, which allows a large degree of smoothness control.

Apart from smoothness parameters, all smoothness functions have the same call signature:

from pelutils.ds.plots import double_moving_avg

# Generate noisy data
n = 100
x = np.linspace(-1, 1, n)
y = np.random.randn(n)

# Plot data along with smoothed curve
plt.plot(*double_moving_avg(x, y))
# If x is not given, it is assumed to go from 0 to n-1 in steps of 1
plt.plot(*double_moving_avg(y))

Examples of all the plotting utilities are shown in the examples directory.

Supported platforms

Precompiled wheels are provided for most common platforms. Notably, they are not provided for 32-bit systems. If no wheel is provided, pip should attempt a source install - this requires <Python.h> to be available. On Ubuntu, this can be installed with sudo apt install python3-dev, and on Fedora, it is installed with sudo dnf install python3-devel.

If all else fails, it is possible to install from source by pointing pip to Github directly:

pip install git+https://github.com/peleiden/pelutils.git@release#egg=pelutils

It is also possible to install from source using pip's --no-binary option.

Project details


Download files

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

Source Distribution

pelutils-3.8.4.tar.gz (75.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-3.8.4-cp314-cp314-win_amd64.whl (63.9 kB view details)

Uploaded CPython 3.14Windows x86-64

pelutils-3.8.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.8 kB view details)

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

pelutils-3.8.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (82.2 kB view details)

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

pelutils-3.8.4-cp314-cp314-macosx_11_0_arm64.whl (62.5 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

pelutils-3.8.4-cp313-cp313-win_amd64.whl (63.6 kB view details)

Uploaded CPython 3.13Windows x86-64

pelutils-3.8.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.7 kB view details)

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

pelutils-3.8.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (82.2 kB view details)

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

pelutils-3.8.4-cp313-cp313-macosx_11_0_arm64.whl (62.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pelutils-3.8.4-cp312-cp312-win_amd64.whl (63.6 kB view details)

Uploaded CPython 3.12Windows x86-64

pelutils-3.8.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.7 kB view details)

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

pelutils-3.8.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (82.2 kB view details)

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

pelutils-3.8.4-cp312-cp312-macosx_11_0_arm64.whl (62.5 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pelutils-3.8.4-cp311-cp311-win_amd64.whl (63.6 kB view details)

Uploaded CPython 3.11Windows x86-64

pelutils-3.8.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.6 kB view details)

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

pelutils-3.8.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (82.0 kB view details)

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

pelutils-3.8.4-cp311-cp311-macosx_11_0_arm64.whl (62.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

pelutils-3.8.4-cp310-cp310-win_amd64.whl (63.6 kB view details)

Uploaded CPython 3.10Windows x86-64

pelutils-3.8.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.5 kB view details)

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

pelutils-3.8.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (82.0 kB view details)

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

pelutils-3.8.4-cp310-cp310-macosx_11_0_arm64.whl (62.5 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

pelutils-3.8.4-cp39-cp39-win_amd64.whl (63.6 kB view details)

Uploaded CPython 3.9Windows x86-64

pelutils-3.8.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.4 kB view details)

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

pelutils-3.8.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (81.8 kB view details)

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

pelutils-3.8.4-cp39-cp39-macosx_11_0_arm64.whl (62.5 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for pelutils-3.8.4.tar.gz
Algorithm Hash digest
SHA256 6f599c279f01bbdb35db73c8f08c88930a590eba818108dec4bf607d1660e537
MD5 0b34282d0dccc75f0b65852f3ebe4c7d
BLAKE2b-256 6d78f3189fbd92114ce460e8fb0ecbc99631d5d8a5cb4d8b35b47384a8deea18

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pelutils-3.8.4-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 ae16d9c25423752bfac913c6917c7f8d951b6685674bd59cc3c0f150d7511249
MD5 a16f5cad2f82192d5045bfdfb02d83a4
BLAKE2b-256 0011edf7ec62b790e2df84b570c88f7e36a3ef9f93e044dfa52eddb75d0f79d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ea74a84627193870c8a925600dc6f8bf18d52f8348fe16ce3f3b1990a837a502
MD5 2302df8360c6194369e45f507b89ccaa
BLAKE2b-256 61f5aa629bf93aa81e38f396bc77633e2a80dabe8b5ab933237d87ba1fd58ec8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c23f020c73bc605ac39fd00eb3de06053e5bc06c158268f42f784d5077691db4
MD5 173b84fb54e6eb9e914588a69934df8f
BLAKE2b-256 d37e0233d01013ee9ef54dbfca75841bfa2a31ef4269d2d8747e7db3a0ea7452

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.4-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a3b7eff755e49eb7ef20b1de2621f34f79b47ce6357a09c7e59cf278940791ae
MD5 6c110d1a0939227e3587950b92dad796
BLAKE2b-256 6c90dbdd99187fabe07d6c38c5a9c0c1524a99268b8456071a05616a0082820b

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pelutils-3.8.4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 41d27f3bf12f8b4be64a1157f78c92e8abc40181f06eb2dc913f4bd78dda760a
MD5 e7ec3cf316a04a49914e9d8679f3f588
BLAKE2b-256 9c1f4cb67dccee31745aab4b83725d1fd99a3d18364ed48aaafa073f5ba33cd2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e55cb77bf43e0d0623c0c2fffd3a95f9025e38dd84f666296f688d88ce3d8b10
MD5 d4ac7b787a874a7a1b89f2f61e21481b
BLAKE2b-256 04f4fc132514b9faf95177c5f8fa51d0065c8af288139ed511272cdfea6e726e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 fa390306badfbfcd123003a9f29ef0072c7df2b82d40f1ca66479bbd480e25b8
MD5 eb5f7cc4fca79325926a51321bcc9742
BLAKE2b-256 bb994f2f7b1eb31502d73fd555ef7a1aedc15dcfca575cc6c955e4037e920077

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.4-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dc5029d923236ea44b4e37f3941c01de0f76634d19a7c8dbffef4a0b6efb88ee
MD5 70c1d98ba83f239d53dce9e8a17822ba
BLAKE2b-256 5b92304227525064ac1a54b3165d1fb952563a21bcb0c650044cda6924d05e7f

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pelutils-3.8.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 19d32a6e2262c45595fe11c11dd7aa292fdbc8a52b2d8125d9879fd916e0cd18
MD5 b72fd3e8253e1c6e363d76f770b1d15e
BLAKE2b-256 6d9897d50d4dd76df6cccc34deec2cb634c1a08b2b8a91c11c184d368b0560ca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 baefca346d7abfcc2c2ca80567458989812248a974423eb36026c2c64205d19e
MD5 3f2854dad39ee0b0a69adb9fa60f8ff8
BLAKE2b-256 6e21c284240c592909ab89df7a562071e22648c6c90c08773575222cf73b0279

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9ef29c213708090456a41cbc46b36ca5a996b9c41b820f6b642ce3e426d9c006
MD5 360f51ad4dac679f3d61830a3b5dd86b
BLAKE2b-256 f83e0131f45158d74a33339dbb3bd91a726722416ba49403a23e69cba95ceb72

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9c00b633f6261bf528c8af56f40463231d0caf50d1e9a211628b480c31801aa3
MD5 60f2fec30fd98b21edf5b989f7b6c39a
BLAKE2b-256 0c4376f5ec682fb14455b4973d0aa8d8946b83850b0cf3e9c47e06fd511ad09b

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pelutils-3.8.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 52a1b2982c32ff8feccf1440029bb63e2f43d1af2e60ccd8a29d313ad1c35b58
MD5 fc416a837f5ff16a7c57eea5a05a6718
BLAKE2b-256 18908b43fa6b792f9675f9815dbc254051afa4ab84f5767713f320cfe8ae3b25

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ae9b6eb9413477d4a33cd2396ac0902d03a88070f57f35a37da33739138a52fb
MD5 478c87a1024512cc2650da48ebfa0da4
BLAKE2b-256 bddba6fd21395d2c623e444855b2c97d8d43f0f85d9ec56ef824e6e5240f0988

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 68e74eec3894bcc50f93c577b6320654c06dfe047f08bc0636ce30e20ba7d131
MD5 91e346ee316d175345349ecb96d76a2d
BLAKE2b-256 1fe954c1c88b75af96519b901a79be717766ecf390e8c25d560686e63ddb1501

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 413bba523c44783dfd660a120def6d97778e248bc52d87c990ddb200eca3a950
MD5 5c3ae6bf8053c222eed0132f6b2b5286
BLAKE2b-256 d6f96039233f7cf8eff777ff8be912171841f4a343c44eb63b02633543e54f92

See more details on using hashes here.

File details

Details for the file pelutils-3.8.4-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: pelutils-3.8.4-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 63.6 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pelutils-3.8.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1f0fe9f1f91b4bd71a602ded0d8f37737bedecd9480fd46cdb07a81c32c0922f
MD5 bbb7d6e0feebf7c8566a80aad873a62b
BLAKE2b-256 8dd45fdc9b731acfa44b6b6384734ef2fd0796657bf9b831742d330ae37e9d14

See more details on using hashes here.

File details

Details for the file pelutils-3.8.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pelutils-3.8.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6403a7c6ce74e8d9c495a343d45c926fcae21e9ab534b7e85ca1f2ed414d9e7c
MD5 a256b48905b123c7f5f7065d2b55200f
BLAKE2b-256 8e046fb32877db45ed2952e32a2ffed1fe9f8f4d5ca776bf230583ed27986a4b

See more details on using hashes here.

File details

Details for the file pelutils-3.8.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pelutils-3.8.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 144c6ba830068706a3990f864b26f6552de2e803277291f9ed247fee6390a3a6
MD5 bef80d841c60e1bcde1d6ec692e848ed
BLAKE2b-256 7e278c87f617915f539c35f6db0386a388b6c076ccb1fe798344b2b9dbc63f5d

See more details on using hashes here.

File details

Details for the file pelutils-3.8.4-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pelutils-3.8.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3b3863c98a167ecb7bcecfcb69086021bace19856310fe797bcf0a374cd0a7d2
MD5 6371ea938d2b2d4321af652813c899de
BLAKE2b-256 bf22e04b04065ccf2f5fcfc6745029e36bc67998eec45087a8bd73ebe68f5e7e

See more details on using hashes here.

File details

Details for the file pelutils-3.8.4-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: pelutils-3.8.4-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 63.6 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pelutils-3.8.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 b7a2bc9c620a89ad9506b134eeab141a9eb70fe26b79ca499c55020a7796daf5
MD5 186ac2e37d8c4a9491d75b2372b70c98
BLAKE2b-256 a94505af508d79f5a707de4f2a0268f1d2aed27f9ab8c6ff3c2ee2ef8863033d

See more details on using hashes here.

File details

Details for the file pelutils-3.8.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pelutils-3.8.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4e04113fc535f5999094208b601b5aeafba8132e49e0e2e89561915437681ebb
MD5 30906cfa99126d9d6f690f051d60c8d9
BLAKE2b-256 6710ea6dfe392748aac4b4d2b54f87f00c882dc7cba68063fec0297ac0741f24

See more details on using hashes here.

File details

Details for the file pelutils-3.8.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pelutils-3.8.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ddc26b7f8fff115764b079c1c4a2e521f9af17212afe15f70767bfd76ede6633
MD5 0f7e47f226ae278f3343e7303f652ac1
BLAKE2b-256 437dbcdecdc3eb245436d94a1ad7d73ea5f809c18e3b0ac36e09fe7ff0b1b0a6

See more details on using hashes here.

File details

Details for the file pelutils-3.8.4-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pelutils-3.8.4-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0adf1fc692b927f1bb996ca38850119774113d0eddac34c9fea73adaa9b9380b
MD5 77096b5b6bde45f1daebda0ea05690f1
BLAKE2b-256 46a81bf7331e0e8efbba28966a1ee2229b85a83de6053f4463db901b54da7e63

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