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.2.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.2-cp314-cp314-win_amd64.whl (63.7 kB view details)

Uploaded CPython 3.14Windows x86-64

pelutils-3.8.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.5 kB view details)

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

pelutils-3.8.2-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.2-cp314-cp314-macosx_11_0_arm64.whl (62.3 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

pelutils-3.8.2-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.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (81.9 kB view details)

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

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

pelutils-3.8.2-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.2-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.2-cp312-cp312-macosx_11_0_arm64.whl (62.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

pelutils-3.8.2-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.2-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.2-cp311-cp311-macosx_11_0_arm64.whl (62.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

pelutils-3.8.2-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.2-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.2-cp310-cp310-macosx_11_0_arm64.whl (62.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

pelutils-3.8.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.1 kB view details)

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

pelutils-3.8.2-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.2-cp39-cp39-macosx_11_0_arm64.whl (62.2 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: pelutils-3.8.2.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.2.tar.gz
Algorithm Hash digest
SHA256 2c5c1168412fe127ef2864072c441313a457387f087447cef63bbd63803a9a21
MD5 a332ee2e70dbfd8de35253a1fa936d04
BLAKE2b-256 228bb3b8c40b7dbec6d8fd52e160d4ae97f321261a82deb5b12abbfbfedb7956

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.2-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.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 a8b4c6cc2df8abff9bb3c4a86a01a8f4d73b1cefed62325987a10a5d80a46511
MD5 a220d4d0de12628af3341bdf778bc871
BLAKE2b-256 3dfbeae9ec6f8999f58551dae8036032881dbe27d14cb69cdd11d1c61ced3f7b

See more details on using hashes here.

File details

Details for the file pelutils-3.8.2-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.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ae567ce8246fc1e306f6e7044eaf0b7b5acabb207ff9da7c30b0e54ec568cab7
MD5 3f686817e9a4c69e2f41eb0ee0825c76
BLAKE2b-256 bc37da09be1a0f7772432e5e98b31dfcdbfeaf4dd2ce1d2f261a1a878e272bc7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 393fff47966af1caa8cf3654318df5aea0891cf8f5369bf39b17072007260b55
MD5 183448407dc04316ad9de0bcd589364a
BLAKE2b-256 1726dbe61ba805e49f620e12c85f88612b3c801fd10eb4a0c2391fb3c7602859

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.2-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f9f134243b1922218e71ca4c8f54f20611986692a3db3a72991d177b111c396b
MD5 9a526ff7438a57d48b17370665c429cb
BLAKE2b-256 9fdfaf6f4cbc36d5ab40d3bae541e28d0ce2bdb07b1fb92e13ef48a01fc6d6f6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.2-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.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 855573f8d11b8b2512bb8d7366a91cdb42f398a91b8410cfbd30fdb432116917
MD5 5dc1c244081959cab11a4779f48c1242
BLAKE2b-256 a8abacd709c9f27effb6af2fa9299ca4b2cc22c798c4493255c68ef880944479

See more details on using hashes here.

File details

Details for the file pelutils-3.8.2-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.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a7cb58b4859980f1b6c2b66b7e33a3d46b840ecefc148b2feb33b5a044a06b40
MD5 ac2bba8d18ef2866fff6184f34b9148a
BLAKE2b-256 f62721d06dbd0fb3306b1bdd75d599bba41d499577bfc72877db7bfc84ad0e3f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3f09af5367cb17e8c07ce67c9778fa06cf74c8d5d1a51ccc7355bc461547820a
MD5 50d816eaa091a5e2d04e2b9fa6f99668
BLAKE2b-256 fd645e2b2a48b063d555ff89caf70c2445e61745a45f096a2ceb9bd56a4f9aa0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 813d4f17bc8206042037bb2a373c90b4f873147129fabfc02155da077c558d92
MD5 4f5779f4411612d1e79721fab31dddb1
BLAKE2b-256 c8f6c13382bde127d50166a7c4a5e6c1fb8ef45013b42ad5aa243c54fac175b1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.2-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.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 55f9ac541f9ff3b6c229ceedf9e03e895d05981bf9116d555db6ff202d4c2d9a
MD5 ca50ed6b729f9d516d1ad0e1abc1dec0
BLAKE2b-256 829c3458dd5adbe6ea1ef1e88fd8be639bb479022f61d2f15e36e0b79847b501

See more details on using hashes here.

File details

Details for the file pelutils-3.8.2-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.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fc7385e361ec9cb4030f2e1ac7a5140bba34fbabb21692829a165ac0b875510b
MD5 23be82816185b3228e489ecbaa11a203
BLAKE2b-256 f8632e47fe4d3f3782ead89901b98411cb1879e363e8fe5f938b06347b27be59

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2fce7e15f70f5bb3e5a85d37bab904056a6a57a1ac3382a2f95963d3e6876c6e
MD5 96240e8feb97fbe527862d69931f2e67
BLAKE2b-256 09a6a057c97512c5bd523db92e55eae2a820fa4aa552cefd9836ccb06acb3f38

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 79398b2dfe02626944f8b124c00960cb611bd526fca1ca8e92e6ecf92dfff4b1
MD5 6c213645001749f455bedfd4facc9442
BLAKE2b-256 f936e1a017303e877f065cda5295a1acf6d7e22b51c05eba02b47132519076e0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.2-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.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c27993c76efa803738599e19f025b42e0c78bbfaecf7ee87fda471af52b08c0a
MD5 1d1f0d4ddf90be4cd32e91ab268dc185
BLAKE2b-256 99e28c2416ae12252e42ec72e29d6ddf2aeff2ebadc430f02fbf3252e707117e

See more details on using hashes here.

File details

Details for the file pelutils-3.8.2-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.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 94e1e49615f71d9831d5a898bf81c084804e687d5671e6d72a94b07963de5c99
MD5 a0b0365e25ffca3fc0459838c5d237ae
BLAKE2b-256 56702a27811cc73908fba65eb8725f56ed55442aa7d4acfbe6e9d00b97f94d48

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2f2b8ba98273b85d924e583880ba92640e6376966814f55212ffe3d03273bb10
MD5 a152fabf2c2d96e584f9b5d49ebd6c0d
BLAKE2b-256 e4e8b9422be1172e211a5bb09544b66bdab3a9dbf8ed373ab181f17ebe9f4881

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 984498d67e4dcd39de9a491b0e5921b683b5779910ea07b0ef13ef7a3b074725
MD5 4bccefcf877fedc21d0ac836e25114ca
BLAKE2b-256 199298319933925c5851375b37ca55411655e1851e7c8e6b0460d19b31b70fa0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.2-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.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f6f9d4435125d91f240237ca85683da6281ba6d0d33fb5a1c2eedc2cec421808
MD5 e0e2455128349f730a11b3ba2f38a7d6
BLAKE2b-256 99ef8b37aab0c7aafb62b785f350aa904b7cc61a44b2d2294152d834caaee684

See more details on using hashes here.

File details

Details for the file pelutils-3.8.2-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.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7c29160bf46c137945da089b2f6bfac429b99abac4d587fbbaacc8c06e63cbc9
MD5 fbc820caeb8c3f659331199f20a622b5
BLAKE2b-256 d7627fba5beb58ed38c39a9146bc6f0316783171d2fb450b7adbccf82461c813

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 24506930cb80e9340d3fb3034e13089d8a67d5da0af76c09e42d60adf336ae0b
MD5 bda80a4bcc9d1def09bb04cf18a66185
BLAKE2b-256 448c08f0142fd3ef3abbf76a7e0b04cb302e7a1c90ab679dfe90ad772d8ccd10

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 eb0b67beb6a13f71e2d555bec500e04e0399e84970e865416e0b7622d190c6e5
MD5 2d3dbadf1c3e3b780657dcc56aaea0e1
BLAKE2b-256 9f115312f6aeae9455410263a80a9f63e926f987e855277ce807eadc532fd95d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.8.2-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.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 12c9831c47e2c7262ea4c5aed2659b54cd3c953409befc3fad77a1f39678d28a
MD5 5878b0e6873cc3c8624ac067601a018c
BLAKE2b-256 c41288c1310ac80af8cd86058f72e5f29c9220ab9381073b84d4506012e7bbdd

See more details on using hashes here.

File details

Details for the file pelutils-3.8.2-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.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e098ad7d7b8a3adaea65f50a57adf4c1d441ae5df1eda197b3b03b897d029b31
MD5 9cb774a0f90577e71515ff38ffff76f2
BLAKE2b-256 b50dde7b5eee1cb450222c0e10f21fd36434572efbad386f3105070fd090a0b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 441df5efc2b7f2adf7e672d114b3f4c56a46368a1beea97b6c243da480f30937
MD5 e7c841cd0b06a3cdf7cae21f2a63c794
BLAKE2b-256 7537305289d28c18e9c2f9a5b06f6b666afb2a46dc2f0cedcb90f1f1edf9b2a8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fc0be81513949bca2b4b2c76219b1c38f1d7a29b579657d5a5a91dc4802dbde9
MD5 1b7b4ecc8393b7ecb9f0b4b65839cdaf
BLAKE2b-256 acb5b0f335972432705d042266eded998974ab380054b3e668ee38427e859961

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