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.1.tar.gz (75.0 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.1-cp314-cp314-win_amd64.whl (63.5 kB view details)

Uploaded CPython 3.14Windows x86-64

pelutils-3.8.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.4 kB view details)

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

pelutils-3.8.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (81.8 kB view details)

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

pelutils-3.8.1-cp314-cp314-macosx_11_0_arm64.whl (62.1 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

pelutils-3.8.1-cp313-cp313-win_amd64.whl (63.2 kB view details)

Uploaded CPython 3.13Windows x86-64

pelutils-3.8.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.3 kB view details)

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

pelutils-3.8.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (81.8 kB view details)

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

pelutils-3.8.1-cp313-cp313-macosx_11_0_arm64.whl (62.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pelutils-3.8.1-cp312-cp312-win_amd64.whl (63.2 kB view details)

Uploaded CPython 3.12Windows x86-64

pelutils-3.8.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.3 kB view details)

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

pelutils-3.8.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (81.8 kB view details)

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

pelutils-3.8.1-cp312-cp312-macosx_11_0_arm64.whl (62.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pelutils-3.8.1-cp311-cp311-win_amd64.whl (63.2 kB view details)

Uploaded CPython 3.11Windows x86-64

pelutils-3.8.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.2 kB view details)

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

pelutils-3.8.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (81.6 kB view details)

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

pelutils-3.8.1-cp311-cp311-macosx_11_0_arm64.whl (62.1 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

pelutils-3.8.1-cp310-cp310-win_amd64.whl (63.2 kB view details)

Uploaded CPython 3.10Windows x86-64

pelutils-3.8.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.1 kB view details)

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

pelutils-3.8.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (81.6 kB view details)

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

pelutils-3.8.1-cp310-cp310-macosx_11_0_arm64.whl (62.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

pelutils-3.8.1-cp39-cp39-win_amd64.whl (63.2 kB view details)

Uploaded CPython 3.9Windows x86-64

pelutils-3.8.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (80.0 kB view details)

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

pelutils-3.8.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (81.4 kB view details)

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

pelutils-3.8.1-cp39-cp39-macosx_11_0_arm64.whl (62.1 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for pelutils-3.8.1.tar.gz
Algorithm Hash digest
SHA256 1e31e72210c9cbbd66d8ff0dcde44df13ac490710c019f51ffcb10dae6ebcb92
MD5 1f29d4252a4c0756633ffe396616424f
BLAKE2b-256 9931814b4c4985ad9bca9f3d58d3966e24b62b56c4c6e80dda5845892a150622

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pelutils-3.8.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 49ac799bfdaf2bb535c13e0ea77205b5853b4ed511551e77b499dec8c142546a
MD5 a3bd0b4a789631a0110609a61f04c715
BLAKE2b-256 7bfb0dbf27b75106463c9b5d90e08f8b769a309ccc91ff1d6ca342e5c5cbf5c0

See more details on using hashes here.

File details

Details for the file pelutils-3.8.1-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.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7905cec8ce66ee13e0c4a18120cc3da0c2db25888e4c7aaa7236037f704a2eab
MD5 2733264c3047230784689009d126d28d
BLAKE2b-256 e9694db5882a8395d700d9449359d62bbf6e43c03c70d6e3843d291a821a2aa4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0a8feca9259834dfa9cc65f4e51dc203367f318d9087a4806943d14a3b7f26fd
MD5 6d5e73cfcfbfc9212031b846f3b473d3
BLAKE2b-256 ff5f434e525bf5d5fe64a33c03c9ae8cfe781cb00d8d22ed177980b90ff39c77

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0e90892944363793c3036849dc96b4fd5d354e0aaf150f72f53a627ff0d6a0d5
MD5 314b95fe3cc1dddfc9de419e4432a6ce
BLAKE2b-256 29ff75886e6b58fe016b1b8e25114426a5328f51972eea3bb0d63d4da6f19720

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pelutils-3.8.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 902f68acb18e824eb3df40da7f6ff327facd6897af50d572e730dfc5bcd942ae
MD5 9254d6cfa7d61083785e2f9f11c2afaa
BLAKE2b-256 4174791300978f19fbc6db3bc1fef6404f6299a1d18315235ad83900ce2c1482

See more details on using hashes here.

File details

Details for the file pelutils-3.8.1-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.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f95b65b5a8e911dfd81067c322afc10233c5a76f606992106469b51367d0aba2
MD5 0b2de52b34df93dcc8c3b25b686bcde8
BLAKE2b-256 99e23f3ea0aa77e4573a6359e7e01df15312df1c9764afbbd310e338a44ca489

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 038ce6f7d9c2c32d372a1ff976979fd6a65b6e5cebfbe076b1d7dc0a0b4f7e44
MD5 d2911b4f4d92db86ab25d342318a252a
BLAKE2b-256 7ca88e6ed4f9bd1bd2845f34e59e2e986ddb71a2897490f4b46db15728681016

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a50aa7d373167a467797033c5ff6a94396130a62964f0804ac2ea2e114b6a6b8
MD5 f052a8f875c8052edbdb6ed28393b3b7
BLAKE2b-256 907f44f0d93d19ce16e128ce9ebbacd98cc6177920f148dbddefd651f5bd3bb5

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pelutils-3.8.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 85c598489eb91962f5e8864cf5c4b75d0ad1f7cfabc8e8df60ccc57aaaa180e8
MD5 5e4fcd17d63d360f8cae7e9c512bdcfa
BLAKE2b-256 64bd5b5d6896a059e91bc0d2cb2093021e23a18cf78d911b3debdc78c065a38b

See more details on using hashes here.

File details

Details for the file pelutils-3.8.1-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.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5cc213761d71a577c861656cd34462640306dd5af8e02da3ce9eb20492841ae6
MD5 7734421f9b27de60247c640b725e1aca
BLAKE2b-256 02fdb08df479d56ca2ea1c9badd706310d6d93321d3ef53be13215534ec739c2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2839f151fbbe6f282075b9c0a3edc6a27d61fdcec5adf8cde4fc9bb5902c6bb7
MD5 365783c339125735a6e23faff452074f
BLAKE2b-256 76957527ae6511aa4de359d88498574b27a5e4036a3bd2acdec6aae791e19331

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 82cbf79cdec1290cfc53bf1681702f553abff06e703703a1dd902d5c07e45c0e
MD5 37abcf23259106457c86bd974e8e8bbb
BLAKE2b-256 1fe91418788c3291ebde44dc96a9c63a2bb862de47ee60f5684f0d559ce58f61

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pelutils-3.8.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e417eb73bc127e49b35b630c9c99083ac8dd7fe45762162d84143128028915a7
MD5 71ea7d920e47d607d7471356f8711538
BLAKE2b-256 211ae82d0b6f3577ea459adbc93f97f798ed71efdcf312d13d4f26d9ee976c0c

See more details on using hashes here.

File details

Details for the file pelutils-3.8.1-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.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a20a6c71ce86a7a4425f01d2a652a1934a509c09b0517d541c2cefeccdd6bbfe
MD5 63e1207a9201f490e232d9083a3e3e95
BLAKE2b-256 0498da372d524fd8ba5eae8d2a579879e15c8b0e8d0183da37bcd88d24e7a04a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b4a926b59a7cb94a2d52433d4ae92428ceb697e66ef382d9b49eb2973b063844
MD5 e91b1be084bb53bf0907b7daaa61c397
BLAKE2b-256 49dbfe3b34409a72b86a5c1992852cbd6d4679e1e7bd1dfb4d70f207063810e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f39dbcacc4872a7f21f3a62df62a74b418e39fc9618f0ff76d32739ad459fa1a
MD5 82c364020644cf173447e1eb84d7e6fe
BLAKE2b-256 2a6fc1c6722da0a8698c3553add395e7819b8016ad9cae47aa3e59036c40b257

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pelutils-3.8.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 6741326da46e7e79e2883704ae2a4bdf7af47e7b35d2a696730dbda4d4b9ab37
MD5 98098d5c53ead3909cf16234219643e7
BLAKE2b-256 22b79af927cbcf897ab3a3266737f10d8437067c76659d1236771842088e6b1b

See more details on using hashes here.

File details

Details for the file pelutils-3.8.1-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.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6bb34bbef64f647df2cd2f97e5d8e0fc946b9f3caf01359db21c97029fadf9bd
MD5 33c7d5708816d6e3b481e569ccb64225
BLAKE2b-256 65600d642e689fa39e6e2b769918f46b8c3c478393a23df5d9006be15013fa40

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 34b333320558985210e38810c020a1a45434dc7f8b267acbe72c181258fbe1ef
MD5 9cd677b0dc7db034d973a9cf2b4c8ea4
BLAKE2b-256 58cf0530b65e45e7ab7993a3a254a36ff07c9056d78f34cbab1b76afda7e680b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 771d38f0e4802028f85655242b8e879d7db3fca7fcabaf0505e2fd0b604caefb
MD5 440064612b6aef3fda7a633e36875d84
BLAKE2b-256 ef0e04ae8ab91261dabb90a8469690a9ee417e3fc7181ac7c9ab902a9d4336e0

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for pelutils-3.8.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 23b02465bc099204e04d5772064427043a9484aa89412b9f01ca8f3aa15cabc3
MD5 dc00eb3516e3e3735bb6fb5add69ac72
BLAKE2b-256 e46542056a9ab573a09da5acad61c21f52961c2f25366e5f36437dbabcc82b33

See more details on using hashes here.

File details

Details for the file pelutils-3.8.1-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.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 164784326be4d6c2b08add801c67645449dd59488425d0d7f8a964c09ee0adb2
MD5 c2709872e61d22c1a36eb59ddf59269d
BLAKE2b-256 e92d868849022dba14d0442229f2ad5be565372de1977df23b57a943b8d34b9d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ddb4ad0d034cad3bb219ef6cf2e054e2d0080f9edcdfca2f32d44bf5dd07a203
MD5 3bfac5abe3f2fb3ac104ed1c47064a4b
BLAKE2b-256 f7b823aa6e7c537d36b3aad37584f914140d829b820a8f31832cddfffe82591d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.8.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d7f5ce7f9b03b28d79f2a7c8f7d56863ed7e167802bcf7790897f1af06225c29
MD5 d90833ba2dd3a9658c13095ad1335fba
BLAKE2b-256 686f3d943bfbff98b3c099e284f07ffbab085e9c23540828a59ad9d29f99707c

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