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 that incluces save and load functionality. It supports any data type, storing all data to a pretty JSON file. A class should simply inherit from DataStorage2. The stored JSON will be a dictionary-like structure with the whole nested structure. Any nested BaseModel is automatically converted to a dictionary. If a data type is reached which is not JSON serialisable (e.g. normal classes, pandas DataFramas, numpy arrays), they are encoded with pickle and base64. Inside the JSON file, a record is kept of the original type.

Very long lists utilise the full allowed line length before splitting, preventing the common JSON issue of having either very long lines (no indents) or excessively many lines with a single element on each.

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

The class is built on top of the also provided pretty_json which does the exact same as the built-in json.dumps but with prettier formatting of the JSON string.

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.3.tar.gz (75.1 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.3-cp314-cp314-win_amd64.whl (63.7 kB view details)

Uploaded CPython 3.14Windows x86-64

pelutils-3.8.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.6 kB view details)

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

pelutils-3.8.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (82.0 kB view details)

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

pelutils-3.8.3-cp314-cp314-macosx_11_0_arm64.whl (62.3 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

pelutils-3.8.3-cp313-cp313-win_amd64.whl (63.4 kB view details)

Uploaded CPython 3.13Windows x86-64

pelutils-3.8.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.5 kB view details)

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

pelutils-3.8.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (82.0 kB view details)

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

pelutils-3.8.3-cp313-cp313-macosx_11_0_arm64.whl (62.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pelutils-3.8.3-cp312-cp312-win_amd64.whl (63.4 kB view details)

Uploaded CPython 3.12Windows x86-64

pelutils-3.8.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.5 kB view details)

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

pelutils-3.8.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (81.9 kB view details)

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

pelutils-3.8.3-cp312-cp312-macosx_11_0_arm64.whl (62.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pelutils-3.8.3-cp311-cp311-win_amd64.whl (63.4 kB view details)

Uploaded CPython 3.11Windows x86-64

pelutils-3.8.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.3 kB view details)

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

pelutils-3.8.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (81.8 kB view details)

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

pelutils-3.8.3-cp311-cp311-macosx_11_0_arm64.whl (62.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

pelutils-3.8.3-cp310-cp310-win_amd64.whl (63.4 kB view details)

Uploaded CPython 3.10Windows x86-64

pelutils-3.8.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.3 kB view details)

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

pelutils-3.8.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (81.8 kB view details)

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

pelutils-3.8.3-cp310-cp310-macosx_11_0_arm64.whl (62.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

pelutils-3.8.3-cp39-cp39-win_amd64.whl (63.4 kB view details)

Uploaded CPython 3.9Windows x86-64

pelutils-3.8.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.2 kB view details)

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

pelutils-3.8.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (81.6 kB view details)

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

pelutils-3.8.3-cp39-cp39-macosx_11_0_arm64.whl (62.3 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: pelutils-3.8.3.tar.gz
  • Upload date:
  • Size: 75.1 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.3.tar.gz
Algorithm Hash digest
SHA256 0b9ae7209b603d428f7313f82df2c0024a406bc49470618b0323cf9f2f39cb05
MD5 8cc8735b52504e08f73e01430af628e7
BLAKE2b-256 17825f4e75e0b6aeffb5dd3fcf53370e60d1b9e2c9bfdc6aed294cc4ea387be7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.3-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 63.7 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.3-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 aa1b1cd7b33827119d2a191f414fcafed4a084ed8a1f6b36f086fd46b69526cb
MD5 c83f714278360fce4c36a7fe575197c8
BLAKE2b-256 31f4eba3debf61ea3e1076a339485edece6385414082f071b3a053e4b67062f7

See more details on using hashes here.

File details

Details for the file pelutils-3.8.3-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.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5f3045c72899c2f1b20ea768b03724758a7b5164941175b6f66a9b9d44d9c6e7
MD5 f8068d5898d1cadf3538188a357d7e56
BLAKE2b-256 3349302c69f0da17f2afb3c4039a6dd63ee19bcfd7c923557c5026d2184a8d6f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 09aef6e0fdcbd497fec8e494e6ff5b8e8d256df00cd68d0e9294173bbc89fa31
MD5 8d1894edf5d6ff58d1faa249c1a8c453
BLAKE2b-256 71a33b7513ac97599863dafbdbf991858c75d5647c6c91aa68bf47491f980a5c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.3-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0f041c1da782c74d96fc4e04b43cf6b39887d02d1fe98d423a9ada5b01cab089
MD5 71e725dc0dc8cf3a6e6f1979d6cac37c
BLAKE2b-256 9b7105eb96ebc1b30f2e18922b569e1b47543e7fc1a8a9172a10f9b6440e21b2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.3-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 63.4 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.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 112982aeb5d1ce61ec9b5f8c2c809bf3e18dab49d8cefdc8802c86c27e7852da
MD5 65fe7a0b92b83b8366e70bf670a09ff1
BLAKE2b-256 b0d58be5a068f4e7f039c072a3ee0e853db4d4f0ce490488f29d3a7aed005c46

See more details on using hashes here.

File details

Details for the file pelutils-3.8.3-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.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 341ccdbc9dc30dc4a058f602f967d692c3c47fcb8a6c151affdcaaa7faa9ef23
MD5 56bd43cede91bcb0505c3fa05e951140
BLAKE2b-256 564d5f5404d8105558050fb18f7436c287d0fc7aadc6838bf900e36932e14f6e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 624d205ba90a25f50737f3e5a93fa994ab1ef98cb606be4e5a32d6fccaa71d97
MD5 16069225e19c0b5c35224b00a1d5aa6e
BLAKE2b-256 4be67e11e62d2a34bcbb02fc0dfff1f11d45270aeb3c4e6c4eb3f59a2fbc87b5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4d870ea1d2b1948d397a0448a7ab40f4965b0cfefe07e373fb1666c55d83b4bc
MD5 3a34a3533406771155aba7694d485fa8
BLAKE2b-256 ad6042d3eba2735e219ec581578aee609881345d20d839e9792f41799dc40a4d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 63.4 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.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 99b8250abb5993d8f6483c5b92982253d9ef5eb917c4a6db78848e443753d7ec
MD5 65721a7c015a43acd411ae186d1d8be1
BLAKE2b-256 57d7e7caedccaf8b6945a80d30168e3616d9773265fd9c97f46e864afb1e977b

See more details on using hashes here.

File details

Details for the file pelutils-3.8.3-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.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0197dec0c67e58343680a5e8c4f6bfd4d342ea720eb88250e34bbfd0f1ae0f33
MD5 3f3b0847da1f04773f162f6e1ab727a9
BLAKE2b-256 6ee61b9d2f0c092879abeb8c486f8c3e5cf1b0953380cac132b9f5fec05524d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 cdab7e18bae2b3da1b179147a9250f9aad5b111b2fdba878f81a27b94fb49715
MD5 d35cc40d190f348df23269af4f832033
BLAKE2b-256 0e891e985c6bfbfc101a029da7a8fc4ce854b6805d68123ab41d11a88757b5ce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2fcd06805db08f4e2c631e950a670b7aa60e9b92f31e14a062793a49dd5562d0
MD5 06a6907d435bd7eb28fb324ab01720e2
BLAKE2b-256 c41f1c9e3692e14ec519a493732838fb31f63b36f3012eeb2f71d9a1fc21ea3d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 63.4 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.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 8347ae789b10720d7637bb17f6bcc6c931462e9ce01851bb260b9d55145e055f
MD5 c298f257e149b55b45c7fe0b5a5cf71a
BLAKE2b-256 b7ce728ed87922a27ea08dcb467cabb1e2a75d289f276e5975f2719090ff2882

See more details on using hashes here.

File details

Details for the file pelutils-3.8.3-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.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 83f8bd85142a941621f3e03b869968fc09689cb1cf2a3cfaab27fb9da291f927
MD5 ad245336b39f782e51a25ce3df6488be
BLAKE2b-256 8130715b03efb4310b3346a43a8fd39e3ccf14a782ba9cdcfbf01802df596073

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 abbdea4637b3e4fc0a8dc93be78c6a3647ffba4de636bef2e774f4a4b4000ed9
MD5 e0b10cabf7b24a58d0290d0788869f05
BLAKE2b-256 f19750ae2952a2cf61260f28b4ccdca06fd9d6a179cc1fbe3e7115a539063c6a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9659c2c7dfb1bab2ace6f8dd87f3ab1340816b2050e61c879a0c975ebf779176
MD5 b2c4d13c3e2f51a418f8b66e053a1f12
BLAKE2b-256 b2c26d2429e8831b412490e61bf43996b3d050a64cab9c7647cd1562d18764dd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 63.4 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.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 4d751f05fb9ec1379bb1bc9cbfc4d45124aef36d835cc44accf7e2572bd0b7d3
MD5 46c9260f723e5da9fe43e556e50a3723
BLAKE2b-256 c89fdb694411c655b2767ce06beaa5aebce09ab2aa805bbe524441dd08490d03

See more details on using hashes here.

File details

Details for the file pelutils-3.8.3-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.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 28002eccbc74b678463f6070c7e2d75d207a83378f0b4b128a0e377d7960b9d6
MD5 c95c1e377dbdb62a67c34fb6295b00de
BLAKE2b-256 018103b1a88249643c95dc970108558faeed2f344537711037c334a6a8e6d2ca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e8bef4d6521b6fa7d7be9d2bcf176c72f7d615ad087e198e7ad28ceca8df5897
MD5 936c2abb947cc0da231158e8a9d0cf8a
BLAKE2b-256 10839181e95bf26b67fcd08df996178fb043563f14ae29a74a3cce8b96c131fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d8614d975fec69d40315b3ee0c5bb1f8dc16149881622a079d2dbba9a2ffa0be
MD5 ad454ecf3074c7af13b00b5c9e1c2604
BLAKE2b-256 9aa4f321a43e615ffa8134e957c5b53d5a678ee0a1789aaf4453a6e666282c29

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.3-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 63.4 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.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 4b788fdf28213cacb925dad27e7955d7e3617b4f1a6901a41c9715b9b7d1096e
MD5 6dd179b929c87db512b0dcefcc83ad4c
BLAKE2b-256 d9f465ca24caaecff050d0d9bc07a91be9b1edbdbc749f85884c46ba00ea3318

See more details on using hashes here.

File details

Details for the file pelutils-3.8.3-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.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c8313d6d76bcf794cbe2092c0ab4f2baa2c2b453117433eb116ea6e532a3f559
MD5 c786ae5cf1a3774280ce37b6c267b40b
BLAKE2b-256 2c03d7c44f2e61fcb67b1f2b569fd904231b8ae9ba28e386714dd88cc66bf5c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 8c93428f7152189a559ced1df95f691d18c593785c06a65fdeac7645b53a5431
MD5 177b604e2803600f719d55013601df70
BLAKE2b-256 9980587d9f56f04489222624dc11d04ad5f80e707e57efce09facbeaad5e81af

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.3-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b173279dc2e42092d44ce6863a306b735fd6bd09d765d19009724bf9fd8cc7c6
MD5 3817385fc8bae2b1b32030fadd8f0a33
BLAKE2b-256 fc083db2d110bbccf55ba32e208396b58c9694ce68082ee1672f85c00d258430

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