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.
  • Parsing for combining config files and command-line arguments - especially useful developing algorithms with many parameters.
  • A timer inspired by Matlab's tic and toc.
  • Simple, near-zero cost performance profiler.
  • An extension to the built-in dataclass for saving and loading data.
  • 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.

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 Storage

The DataStorage class is an augmentation of the dataclass that incluces save and load functionality. This simplifies saving data, as only save command has to be issued for all data, and it keeps type hinting when loading data compared to e.g. a dictionary.

Data is in general preserved exactly as-is when saved data is loaded into memory with few exceptions. Notably, tuples are considered json-serializble, and so will be saved to the json file and will be loaded as lists.

Usage example:

@dataclass
class ResultData(DataStorage):
    shots: int
    goalscorers: list
    dists: np.ndarray

rdata = ResultData(shots=1, goalscorers=["Max Fenger"], dists=np.ones(22)*10)
rdata.save("max")
# Now shots and goalscorers are saved in <pwd>/max/ResultData.json and dists in <pwd>/max/ResultData.pkl

# Then to load
rdata = ResultData.load("max")
print(rdata.goalscorers)  # ["Max Fenger"]

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. 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.7.0.tar.gz (64.2 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.7.0-cp314-cp314-win_amd64.whl (56.6 kB view details)

Uploaded CPython 3.14Windows x86-64

pelutils-3.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (73.4 kB view details)

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

pelutils-3.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (74.9 kB view details)

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

pelutils-3.7.0-cp314-cp314-macosx_11_0_arm64.whl (55.2 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

pelutils-3.7.0-cp313-cp313-win_amd64.whl (56.4 kB view details)

Uploaded CPython 3.13Windows x86-64

pelutils-3.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (73.4 kB view details)

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

pelutils-3.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (74.8 kB view details)

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

pelutils-3.7.0-cp313-cp313-macosx_11_0_arm64.whl (55.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pelutils-3.7.0-cp312-cp312-win_amd64.whl (56.4 kB view details)

Uploaded CPython 3.12Windows x86-64

pelutils-3.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (73.4 kB view details)

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

pelutils-3.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (74.8 kB view details)

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

pelutils-3.7.0-cp312-cp312-macosx_11_0_arm64.whl (55.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pelutils-3.7.0-cp311-cp311-win_amd64.whl (56.4 kB view details)

Uploaded CPython 3.11Windows x86-64

pelutils-3.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (73.2 kB view details)

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

pelutils-3.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (74.7 kB view details)

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

pelutils-3.7.0-cp311-cp311-macosx_11_0_arm64.whl (55.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

pelutils-3.7.0-cp310-cp310-win_amd64.whl (56.4 kB view details)

Uploaded CPython 3.10Windows x86-64

pelutils-3.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (73.2 kB view details)

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

pelutils-3.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (74.7 kB view details)

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

pelutils-3.7.0-cp310-cp310-macosx_11_0_arm64.whl (55.2 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

pelutils-3.7.0-cp39-cp39-win_amd64.whl (56.3 kB view details)

Uploaded CPython 3.9Windows x86-64

pelutils-3.7.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (73.0 kB view details)

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

pelutils-3.7.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (74.5 kB view details)

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

pelutils-3.7.0-cp39-cp39-macosx_11_0_arm64.whl (55.2 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for pelutils-3.7.0.tar.gz
Algorithm Hash digest
SHA256 e15b9df4badd18915882b52f5de251bc46faf70673518477af56d51e82a799be
MD5 fadeebf5151ddc52469cac77eff3b1de
BLAKE2b-256 4eafb60a9e6cd75e58fa3fc392da0d0aecfc43cb549abede5b256dd61c3b284b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.7.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 56.6 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.7.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 8043e8c9796e1bcc209e5d65950b880a308fae035c8352a3e1ad8f9ec1b53fd8
MD5 f90b086d3646774f1e7b5992b5eeb29e
BLAKE2b-256 077d8970115371e7c75c5599ff12a85fc569bccffdc2f591e1610d3bac7a5c69

See more details on using hashes here.

File details

Details for the file pelutils-3.7.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.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9be732eba273c6b9eba744c6c63cb95a6192d3b041359c3c084212b8c21892b5
MD5 5c455ce2e64d2243693a1defed6d1a10
BLAKE2b-256 3b7136b84397c150c01eb6bb32c0f5d7f49a4124bfc0aa01839b446b7ef89db0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6dc8958a288c2d68af3ec5ffd20bca49662cf86d6e3e29e8368ddba4ee1c690d
MD5 72bf3812a91af2d95f32f3c829dfbf3a
BLAKE2b-256 83a83e5046c5315e205b39c9a277b2900e6cfb1429d1e949c1a7abd5e2672d1b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.7.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7b599c8de34476d7ffaf30ce45ecf1782061e4223b36413cfaad2e1746e72d51
MD5 ddfc3b67a10e3a2344c8350bfddd451c
BLAKE2b-256 1b2002b902b91485342e9038896b8deb6255d87a941409b5bdfe28635476f02c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.7.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 56.4 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.7.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 daf49506a44d09e5efc9fe60b17be54f0e0822561d5936f5b982f97e6b0c7614
MD5 cedb5a5ee08c39a9cca2698cb5123f14
BLAKE2b-256 c0f086397e88eb83f103e5011972c56a3192d9192269e8eb3e5c3106cc97dcef

See more details on using hashes here.

File details

Details for the file pelutils-3.7.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.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9d15afee3200263b36ce634ee4127b4ce6419d3b570669b6b82360492e4f7274
MD5 7d2b27e586e09bb8f9f1233bd9b0c023
BLAKE2b-256 8d751f69163e91e3a6602469acc435fd53be079b0c4d8c24759067e969a91a94

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0f2a555687c646c7ed7ac479dcbfa1a1beebe8ac69d59bc5cd3f55ce1b06029b
MD5 7b38b856a579226374093aece570c620
BLAKE2b-256 ef262c6271c8d0246e022d35aeaf81311fb5059bae413470f24f437e590d8f43

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.7.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f783f1a6b9a0f07e44ce23d2c0131ab2ddca0504f0972cf059470d89e303aa1b
MD5 9e5cc1c525903c4180776cbd46e78cc5
BLAKE2b-256 073388c4d68a6c7617f71fdba10c0896b52ebb798f2e03149d82e3812a2ada3b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.7.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 56.4 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.7.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2ddebd38591267872c6b9bf41ac4fed360420f8c5c68e9f75c059a8eb3f457f1
MD5 1179d226c238eb78738a16405769afd3
BLAKE2b-256 d84e234dcdb9a3a0570a5b8c6f221006938833cfc3cdda4057d7650192b3a74e

See more details on using hashes here.

File details

Details for the file pelutils-3.7.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.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1e2f1f2f2c55515bafde3ca3ab833ee149ef0fff43a6c5c2f6fce36c07db369f
MD5 de0e22cd19f60392f9c330ffddcd6236
BLAKE2b-256 0adaf5b24ff4522c87e8df2cd33e363e777a8b2f5b72cb7313ee78cafdc6116e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1e71c1def0c031442e2c96ac38edd0551feb5691a5731905f6278790f1346b1e
MD5 f6bc898cdf3f8802016c4cb37e6c6f34
BLAKE2b-256 b08d169dbbfc66a821ab035fddb3f3031fce6cd3bc6e4385c8d3bec63935d4b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.7.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e106989a75f4b2d027e8db4d5016cafbb484b0276789fa263af1ab9eb439ee49
MD5 3a9538e43342d48b8878313c323fa737
BLAKE2b-256 4dd7155101ac88511e2214b334bc1b34079626c9cf398732121dbe37bf1ce01b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.7.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 56.4 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.7.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4f6797dd5fd9f39ed9453724e180fe12ecd2760ef4ad547c1acb2cd64d488a2a
MD5 5239d48db05506dc206a6e982947652c
BLAKE2b-256 06478cbcaadb6589dd17f999fa616970bb7986a98c789d371bc32013001b41cf

See more details on using hashes here.

File details

Details for the file pelutils-3.7.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.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e0ccf4907538a4f1ce1c552b8102642aa0846c1add3e00ba6b95115f133a65b7
MD5 4a04ec4b33bc500fc021003796f74b06
BLAKE2b-256 bf83b413ce75fabe39cd77394b82a78267b9b1e5fcb96a095b1c5deaf47686d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 87f4cc19a03d7dd858ab934e2352b2fee7a929ecd038aac3d2d823a51f3a59ba
MD5 24e96cc381471abe30a67d0ab0ab745d
BLAKE2b-256 3925c3fafa68bd6ca07ec8716665a8d1f2b1d6502b8a6e67f2cff95e87eb0f1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.7.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3d7f78ec9e2f806fc51aa0b7671d2a0badce20c7105bef29fdfcaae97ad5bae5
MD5 bfc20c5aff71bdbe0743a2454c06aeff
BLAKE2b-256 4839a942f4d6ae5cc37a3ebbe1d3b390242ee2e280d945d2a1d8ddaa59db5eb4

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.7.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 56.4 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.7.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 cd08878840d7c2a491f9fa0392b325f28e1d25118fd5e9c77718709985dafae5
MD5 5f0a43b515c831336f3c1471f8bb9cc9
BLAKE2b-256 a88f5d289bbb8d33a2657c3f23c1803e18ad2ac5b20e18b4f654434a4a4bf086

See more details on using hashes here.

File details

Details for the file pelutils-3.7.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.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 52338747f28f7aac6b345463ce4babaf118c60bf458a5459fa87783e1310f850
MD5 762bb9a922978136dc0e0fc06e62ab96
BLAKE2b-256 cb057e3697d53ea79d69993d6fcf519ad89d3d9f01cda83c1ef58a94906c47a7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 41d8914b6254abaa5d5bbfdf39b43309a498890b149b724bfa2ded403c8374be
MD5 0519b2192b9508e1a981bea08c525313
BLAKE2b-256 7f186a53c795a4761ed29276ea90ebfdc5810cfb8cd8b3951695d09e7a580394

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.7.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 137f2507c6dcba391277b00936d6b2efc78f8b631b7bde0a9eccb064143b0c93
MD5 d0e595c25536b38de3d14a92887fc9cd
BLAKE2b-256 8ffe52b098ec56b17e8e764a208cdd3d07c3598e346c0b82d51dee6b53f9322c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pelutils-3.7.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 56.3 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.7.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 4192ce57a54f34d6d0e3541e67011ee6148f0a0ac4d5bcfefb720f10debf1141
MD5 de2c6b5f867c47379f594447b993797c
BLAKE2b-256 590921d87264558ceffd9d53d0220cc5ed612e2dfaac2cd0c5434846190f0ef7

See more details on using hashes here.

File details

Details for the file pelutils-3.7.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.7.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 19dea15232ed8ef6b8dbe0639786fd7e93b615cfffc6ba6c653723e64effbf25
MD5 6cd3d7da8712667089b4c5990a7ea061
BLAKE2b-256 7e3028a0abde615bee8158bc32ce5c62e4b85f86b65f711ff3e7d0f9b112ca5a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.7.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2b68600e9b51100a0c21961b0ce5489a3a43b2eef73948e4f7a6681c28094aff
MD5 b946ef823251c509d98d93d4dcc1f113
BLAKE2b-256 4b8dbe74ad4b46d2a4d853bf21d55e030bf2815bf0f1225afa1ec0422344f2ca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pelutils-3.7.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 57276c996f241f07f47396f822cb2510223f8bbf48e7d711e268d108d34663c4
MD5 149b578b18633cf576dbf9b1e1ade004
BLAKE2b-256 d886b94eac9ed7a950e814ccf89e3e4b4effc61f21ee4e3e62bd384eceecf590

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