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, BytesArray, ComplexArray, FloatArray, IntArray, ObjectArray, StringArray


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.9.0.tar.gz (76.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pelutils-3.9.0-cp314-cp314-win_amd64.whl (65.3 kB view details)

Uploaded CPython 3.14Windows x86-64

pelutils-3.9.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (82.1 kB view details)

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

pelutils-3.9.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (83.6 kB view details)

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

pelutils-3.9.0-cp314-cp314-macosx_11_0_arm64.whl (63.8 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

pelutils-3.9.0-cp313-cp313-win_amd64.whl (65.0 kB view details)

Uploaded CPython 3.13Windows x86-64

pelutils-3.9.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (82.1 kB view details)

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

pelutils-3.9.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (83.5 kB view details)

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

pelutils-3.9.0-cp313-cp313-macosx_11_0_arm64.whl (63.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pelutils-3.9.0-cp312-cp312-win_amd64.whl (65.0 kB view details)

Uploaded CPython 3.12Windows x86-64

pelutils-3.9.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (82.0 kB view details)

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

pelutils-3.9.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (83.5 kB view details)

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

pelutils-3.9.0-cp312-cp312-macosx_11_0_arm64.whl (63.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pelutils-3.9.0-cp311-cp311-win_amd64.whl (65.0 kB view details)

Uploaded CPython 3.11Windows x86-64

pelutils-3.9.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (81.9 kB view details)

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

pelutils-3.9.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (83.3 kB view details)

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

pelutils-3.9.0-cp311-cp311-macosx_11_0_arm64.whl (63.8 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

pelutils-3.9.0-cp310-cp310-win_amd64.whl (65.0 kB view details)

Uploaded CPython 3.10Windows x86-64

pelutils-3.9.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (81.9 kB view details)

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

pelutils-3.9.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (83.3 kB view details)

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

pelutils-3.9.0-cp310-cp310-macosx_11_0_arm64.whl (63.8 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

pelutils-3.9.0-cp39-cp39-win_amd64.whl (64.9 kB view details)

Uploaded CPython 3.9Windows x86-64

pelutils-3.9.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (81.7 kB view details)

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

pelutils-3.9.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (83.2 kB view details)

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

pelutils-3.9.0-cp39-cp39-macosx_11_0_arm64.whl (63.8 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for pelutils-3.9.0.tar.gz
Algorithm Hash digest
SHA256 6ebb71f3c50c50fda17a85dfbabca3d09ce9f492820317f7b56002773c68d0d7
MD5 732a8d62906cb1a1d7a3e118c9e7e499
BLAKE2b-256 1b199f20f0d0d01ad0ab2f070b3c18a49cfd131a3ba8548e28e301cdfa645147

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.9.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 65.3 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.9.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 2ba989805154855c878517c8b975362a73be2e83776e7945db7b7b5944104ff7
MD5 c50196b3fad8b6877e81b98eb3c0955f
BLAKE2b-256 0abbde617e484cbcbe31883f50281b55f260aba2ebb40697ed9268ef9a9d9b4d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a2e03104e6d0f8c8908ec00b5910c6df101b0da99534882e52c151f32bcf8aca
MD5 69ecf17df49f072bab1e67366391e868
BLAKE2b-256 289a4b009c4d43a546109d2d430dae86f990e45f5acd5f9bc660516f41b61ee8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e91d9a0dfe11faa51e922de0fc62ef68e4b9a64dd17a96a01ff51bdaf96f2fa2
MD5 980d146a606da78cdcd59a018865fc4b
BLAKE2b-256 dc7918d53388e7b306495a6f9b1810cb77286786afa213d688938377377d7a93

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8c7b9644397da2ca92e7f90e2804a7c16a3add69fdff5fd712ba0b571f757204
MD5 af774aab0bf84cb758ec2d3bc196ce34
BLAKE2b-256 af32866e7e8c77015cab31972b86ef754aab71d17253dfe2ca66076f40a8191f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.9.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 65.0 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.9.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 69878fcd3791a4f13c20381eb91b490aca0b63f424abb1ce9715583c58fab655
MD5 60079cf0a83bfa0cae10511633ee4cc6
BLAKE2b-256 fff58e032078f9218c15270773fd795c37cd84b679e538b12d34e37f56ec00ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5b8b607bfd20fc922beafce15898183cc101065fca19a47a1ef6988fb444a598
MD5 e67a994a4289fb95d911e7428876f486
BLAKE2b-256 439870dcaf7ccd297ed600fd17e179fd9a3f5c0a6fa1637f930e76f71bdaf73d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a9ae942e87f977ea37b32c2c13f866e9e5371b49686a61a41c7572e6e2e51bd0
MD5 744571da5b7f49c56d781921bc0bfbea
BLAKE2b-256 6fbf5569f357248766d33877494728fe9ceef767fdaf9d281927425b85a11861

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 81b5eed14ec71a7760f5a64a67f4c1de5ff96c3e9249da37dcf5766bc0f95dff
MD5 4bad58351a7090e7f32e170b08026270
BLAKE2b-256 33c7594e0bd26df6e3142ae1bc183516fdb83263437472ea7007cdcaeba47f3d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.9.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 65.0 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.9.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d217319e5ef3d75c5a568dd99699a12e129925c2f0b4d264f39ae9e6ba9bd230
MD5 bcddc45033fce6bdc64631b73462b031
BLAKE2b-256 b7056c3194ecceb72597b7ce7b52f8bcfea3d32793dd1e9615b72e773983d7d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 56f5e1e1726cc35a06fd3b19a59773fb0b0f75ce902aab218fcc72cbd25a4302
MD5 96d9c1f4b73e1a5f6f57230912f3d51e
BLAKE2b-256 78ee03df293d48be384044a4c262c593231f0ab6d65d291253ff982144724133

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 76ef34ac24eadaff4de420401a73a48fc8c92c8d793013cd8315628d72a479eb
MD5 19c9056e294be70afa260883885d17c1
BLAKE2b-256 c971e39d023ff332c70db2904cd4fa3304616899a91e48a1ef9ca376fb914b03

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2f2d1e7d89990456b5fcc12073687a3684ab4eef514f245edaddabfd21076849
MD5 45f53e43f0a9a9e1fc0f45d919f3868d
BLAKE2b-256 bb61b0a5cce18c49ac2d97cd34fb5c3c337ac6a0f38e6029e43f53ca725a6792

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.9.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 65.0 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.9.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b28a59b0e4696bc41ea401933e9d6632540b01589f5b01c28d66aac6b1371fde
MD5 253a371b03ae1067678b791dd06faed7
BLAKE2b-256 4a7af9389e12daeb212dc36acf5463bff578f1ca4416458bf44d8cb94085b2c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 abf9b04b0fb27dfd1e4c059d71eb851430b3adbeafb82743e20c49cd480e56e2
MD5 df86fda9bb7fdfb5c66bd963dbfb5fa0
BLAKE2b-256 0112b9b2c22ea3e49e0f5a63c30b301e12a507afb6bdbcb61b7a0e289471244c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 02bf23ef811d510471d6e14dc159349f972f188e9add9d38ed3f19b464792d78
MD5 52a53737d4a336581a038a00bd01fb7d
BLAKE2b-256 5944cbe27c9d04b61c6b1701798b6876784aff46eb845497613ee8529507037b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c4ad7a896db37d01402401ef6748fef957afe056e4a311c31ecffb36e7365206
MD5 156ea04be9771df36702889a693ad44f
BLAKE2b-256 e7ad0e937b10069d8a36596d991ab41c82aeca2973c35d0ddfdddbb05040fd74

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.9.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 65.0 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.9.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 dcd4d7c5ae376c1d2228c582718024893f5709a486c5b73edc8ea57c83abaf92
MD5 146e1c76c1ee73de3aa8ca4f62cd0cb3
BLAKE2b-256 d519cdb7787a97b32683ccec79820166e09cab2344b392d7e04d49a45163001c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c13942dcb848e3550cec2e3d77067428ab49600345ea19da2a0edb448d75ffb9
MD5 a56ce9ccfe47b67e880e6cddf580fcdb
BLAKE2b-256 294059a99f3c49050f42f2294e9403a810708dc7dd0c051e4d3218b6495ceb5e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 052c35cb3a67483fa29303e6a99d9221675daf4bbd181f317d909e9e6dbb26b1
MD5 dccea3ac5b51498e8dd016b37360a693
BLAKE2b-256 7a86faf1b4fd3edb34c0b1b1843fffe06f3a41a70dbdde2b550930ae9a25faf8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4ddb5b9f1810fca7e912bb4cc6561ac54f386586c0bc560712574d04ea2d480d
MD5 acbf9202c9ad5ac39f0e39e5a2ffec11
BLAKE2b-256 f2542cb844abd2d534b0d1bfeb6f15a658dc0fcc922832ea13c40c9db90467f8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.9.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 64.9 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.9.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 1b5fa34685fb69c9efaad3e2e4e45d3f768e355c1075bd1c9c02e7afc4832dd2
MD5 25d1b6ff4e2d0e084f696a758e229c6a
BLAKE2b-256 05f8bf32eee4495df346d04fbb919ba7f6eb7290a4efd4ef49cd502a66940477

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4e3cac35cc30922719e5494fdce13c5103076f1e50d3ca441676bc78ab1f1e80
MD5 3c29fd2e2eb55e47bd7aca3fad023cfd
BLAKE2b-256 32e48fd6c0314ce79fb4e07cda995d7faf997812dede05cf94ca8d20365ec0da

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 8746cf2c88bdd642900251dbcd7a69900f8b7243b7da8673bcda0b7a68b25160
MD5 46635368ca58985f3eccedfc0db3915b
BLAKE2b-256 565e05a8ba103e0994f3d1496791ae0179f4f63aeafde57cc22281cd4ec52058

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.9.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5b564c8d9f44079286ad247ab6722aa4692de962413d23af04c8d97ac45a7687
MD5 02587988b1f8c9dd8606087458f71333
BLAKE2b-256 ab1ad66d6608a51e0b978ea0d8fc2cb9201be09a97051579ff63f203d1248567

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