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, BoolArray, ComplexArray, 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.5.tar.gz (75.5 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.5-cp314-cp314-win_amd64.whl (64.1 kB view details)

Uploaded CPython 3.14Windows x86-64

pelutils-3.8.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (81.0 kB view details)

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

pelutils-3.8.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (82.4 kB view details)

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

pelutils-3.8.5-cp314-cp314-macosx_11_0_arm64.whl (62.7 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

pelutils-3.8.5-cp313-cp313-win_amd64.whl (63.8 kB view details)

Uploaded CPython 3.13Windows x86-64

pelutils-3.8.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.9 kB view details)

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

pelutils-3.8.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (82.4 kB view details)

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

pelutils-3.8.5-cp313-cp313-macosx_11_0_arm64.whl (62.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pelutils-3.8.5-cp312-cp312-win_amd64.whl (63.8 kB view details)

Uploaded CPython 3.12Windows x86-64

pelutils-3.8.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.9 kB view details)

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

pelutils-3.8.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (82.3 kB view details)

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

pelutils-3.8.5-cp312-cp312-macosx_11_0_arm64.whl (62.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pelutils-3.8.5-cp311-cp311-win_amd64.whl (63.8 kB view details)

Uploaded CPython 3.11Windows x86-64

pelutils-3.8.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.8 kB view details)

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

pelutils-3.8.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (82.2 kB view details)

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

pelutils-3.8.5-cp311-cp311-macosx_11_0_arm64.whl (62.7 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

pelutils-3.8.5-cp310-cp310-win_amd64.whl (63.8 kB view details)

Uploaded CPython 3.10Windows x86-64

pelutils-3.8.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.7 kB view details)

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

pelutils-3.8.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (82.2 kB view details)

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

pelutils-3.8.5-cp310-cp310-macosx_11_0_arm64.whl (62.7 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

pelutils-3.8.5-cp39-cp39-win_amd64.whl (63.8 kB view details)

Uploaded CPython 3.9Windows x86-64

pelutils-3.8.5-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.6 kB view details)

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

pelutils-3.8.5-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (82.0 kB view details)

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

pelutils-3.8.5-cp39-cp39-macosx_11_0_arm64.whl (62.7 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: pelutils-3.8.5.tar.gz
  • Upload date:
  • Size: 75.5 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.5.tar.gz
Algorithm Hash digest
SHA256 cc11e2f435aa53dfd79932e47adf6e64913475daeed58f7957b7956f5f5831a0
MD5 5daf1d5beb4e74737335c191eae287f6
BLAKE2b-256 4b43bc4f1248b38c0a4791e1872ff53dbbdb3cac273630ba9cb320944acd4420

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.5-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 64.1 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.5-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 f6dca91cefdaae6897f27e2b6ff781b1381751ea105f4aefb0b6f779f80716dc
MD5 ce024d09b238ee6f61b926af62d845d5
BLAKE2b-256 7e504d714842c3ab3cf458d84dededb5ad94a790b6b5081ee90ab50233627438

See more details on using hashes here.

File details

Details for the file pelutils-3.8.5-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.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fb623e42f6586d0c0cca8fd44f53018922921ce695c0255f3801d88bf842fbf2
MD5 43ca3f1ce43884725d5e77f948150e1a
BLAKE2b-256 025d36d7e967fd502c91be10f894f2c1a5920ebbab009f6312f60ffc465d3b3f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2029b5aaf927d15d6746b293e61e5591633d71d400e8130828eaceeaeebc7351
MD5 a40143c08696c44bc496eb8ddd94d6db
BLAKE2b-256 0bf4a67dcd15f524cda8ee86e657f748921cd5d5002c336594eacc3b83ea5da3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.5-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8a502ec82c463d4fa94605f05728512fb9c0fc9aab4ac9f33519cf1a32947e7d
MD5 649659e0bf7ab196f4af480871c5ba10
BLAKE2b-256 98844dc716f0a4cce03c4864a070ff64ce15240f1c201592b81985c5f8c30663

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.5-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 63.8 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.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a85e5dbcaf63b4fdd75ef9afb139937dc9b64ed3afa4899a90d8880a5693f320
MD5 c37a131f67992e5d035f44caeb405f93
BLAKE2b-256 dbc564872ce4238336cb59a540f304d700895feeddbb066a88ae08a59fb2dfa1

See more details on using hashes here.

File details

Details for the file pelutils-3.8.5-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.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6a9efac58b36aa7f3b27f380db940650134d192cd8d92941339133450335911c
MD5 5f64d372fcbce61645c50abae5499564
BLAKE2b-256 b6de0e97414d7df49c7bbf1234701c36644357e0a28bff2184b66725d1d4bb01

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 84599011ff2a0166548c4705ce339b09ec86dbbd0474775c5c5da3f89fef7130
MD5 23a22adc78eaf74644579d92ba09b960
BLAKE2b-256 9c48d0266ca8bdfb4722339d785392d961bb01dc97ccd87737d6894075268408

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ee5619c1d887c8a4bba8a64dfc9b2d3ce671379af9b11b1acb35fd6b9e086f3a
MD5 2cf94e4ea46e0094c22921da6f9a8e35
BLAKE2b-256 5a78a97849d07d87590043d6f7b2cc570ced57a8d0c2d7c10296c0a7cf18cebc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.5-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 63.8 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.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ab2c610e44f6f6303f467e4083c24635899d61fe72a6656755900fe1c6d09302
MD5 ab3d59badea344639854294893a95a84
BLAKE2b-256 9931db24ea681f554ce32325eabb3c225108916686b96eaadceadd3d4555f69f

See more details on using hashes here.

File details

Details for the file pelutils-3.8.5-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.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 06439d4705e1ea7e9b015e9c0163ca355fd07a8ff4ba0a0bdfc3776c9b7dc308
MD5 ec4c8f5849c58ae8cb15a530c89e0410
BLAKE2b-256 12ce194fd7ca9e3710cf30515c49c1401eb7001900dfe2934abf319080e60329

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 99620b30cd2a6ecd04e8e090fddb1003398466b91f42bc7d6a770c954acd3688
MD5 981952f3a88b4c567e8d0f4812670bb4
BLAKE2b-256 a41a11a8a81e3fecef082ddbbc7853133d68a23b3278ca0e208547df8b008f67

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3279ad637a4208fdd55b0b6d66fe2c5639eae3fe8cc5476610eedfe46271ea44
MD5 9c07241fe3cc5c04d0ce0eca59298000
BLAKE2b-256 a11ef5ccdb7570f6456d74b1f7467c76ec0be06d50971d6172dd8345b44e570b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.5-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 63.8 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.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 75a437c49494b00a77ecaf4c57951bf2b626080a37e91f388b04f76091452932
MD5 9351644e4f433d1ca6a6239d8988a39f
BLAKE2b-256 8111a14129b4811d8ccab563c629ee1b6497e9a394f320a4c181dbf2c5c95439

See more details on using hashes here.

File details

Details for the file pelutils-3.8.5-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.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 deb853f672723d7ec278742a2861d2ae7c5c4bee05dbe6fe328dea31e0ec8a28
MD5 7ee33d7ff5e91577086d7ef07f9b7afd
BLAKE2b-256 eb9b605ced8cf08d8b71c22ee9f51bc385a8dabe728ea2b11ecafe14fc039eed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 937fa0358f8e420ed4fb36c27fb86d6c9c89afeb06c81bd6ab130e3c38ec9ffc
MD5 85458524973a49eeb2a33451adcf4896
BLAKE2b-256 632f58d93521ad36e64b2fe0e0e951285dc37759427acf023c1bb65a2e0e783f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 936decc10eed92095c023f5070c941f27d1721212c3637e330a6d69150ca6c3f
MD5 ce54cfd8c7d10b7f181ab48f5aa405d3
BLAKE2b-256 735eb77fed6d751a98a12f92e6e25900e1760af18aa5601037fa4014e27b93b0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.5-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 63.8 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.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 4ddcd453018db60c988f01c7c9fb148106eccfaee44ece833877c45dad854d29
MD5 031919170d4c5a00db8c86d1686b4ca3
BLAKE2b-256 576735790544f69e455d950c8f9792c6c5587602591376a04dc8cfe62b93044b

See more details on using hashes here.

File details

Details for the file pelutils-3.8.5-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.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5eb49cbbccbcd1b5fb0839b1c1c97120fc60699ce97424aa4b6d8d2bae1cf674
MD5 571fab7692d298f0bd01925bc2c52e66
BLAKE2b-256 164f8b3e193232266b7cce9eeb0e8e2913a328c9a238e212e258e6afa43f06f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 38f180a9b8804605a78092178b953aecb4f09d4a185f5bd76efd067287f071fc
MD5 9836818e2eaf1f4a537be95be6b657e2
BLAKE2b-256 3b070ca3aa6e6e46aa9f844586231c30acdc26dcefd9de930178ecff6e2d0b83

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.5-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c073e0df25abafccde6ed2b665c007cd201a112d84b5931ebeda6cd6000b7649
MD5 c7b75cceebca14148fc820af3093fd52
BLAKE2b-256 a3447df98a3a8a9aa41edd2611e10a132bfe3e95e6f2ccbf747e4679d276d4e1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.5-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 63.8 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.5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 06bd06d5d9077c512d3d9fb7da844541d9cdaf410fedc4f6ade9262ef5e27448
MD5 21ee7f703be6c0d50b6cee069dcb0523
BLAKE2b-256 c287898e421c35da15bc08b4f9541a1391684f08d6bdfad946f3f3fef640bff3

See more details on using hashes here.

File details

Details for the file pelutils-3.8.5-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.5-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7c77fd154a85a039a70cfb10975a39616994518d77a41a8c26faede175b1350c
MD5 c5b1833d7c337fa2bb87736c4e0b980c
BLAKE2b-256 f12d80f05784cf6842ec1e6c41dbe2807cc9e8e3d48aba50f84be89ee5dc9eb2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.5-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c5d688222db4d24eeb741da83008da33b36262d05b92031754bce85a38f8b499
MD5 640e7bd684bb6741ab614ec064fb22b5
BLAKE2b-256 48578a81a351ad1f998218fdf325130f048c44cb729d4534ebc2da7036736b3e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.5-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4022a5f22a22b687f478108455328ae0e2f624189323290aadcabc9513c528ca
MD5 4030af6f289b8e8856f50d1ea176a128
BLAKE2b-256 39c942816bf8b1d404d73688223c1ee4514befa4cf1b2e5d09f2d058f1e75b4d

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