Skip to main content

Multiple dispatch in Python

Project description

Plum: Multiple Dispatch in Python

DOI CI Coverage Status Latest Docs Code style: black

Everybody likes multiple dispatch, just like everybody likes plums.

Installation

Plum requires Python 3.6 or higher.

pip install plum-dispatch

Basic Usage

Multiple dispatch allows you to implement multiple methods for the same function, where the methods specify the types of their arguments:

from plum import dispatch

@dispatch
def f(x: str):
    return "This is a string!"
    

@dispatch
def f(x: int):
    return "This is an integer!"
>>> f("1")
'This is a string!'

>>> f(1)
'This is an integer!'

We haven't implemented a method for floats, so in that case an exception will be raised:

>>> f(1.0)
NotFoundLookupError: For function "f", signature Signature(builtins.float) could not be resolved.

Instead of implementing a method for floats, let's implement a method for all numbers:

from numbers import Number

@dispatch
def f(x: Number):
    return "This is a number!"

Since a float is a Number, f(1.0) will return "This is a number!". But an int is also a Number, so f(1) can either return "This is an integer!" or "This is a number!". The rule of multiple dispatch is that the most specific method is chosen:

>>> f(1)
'This is an integer!'

since an int is a Number, but a Number is not necessarily an int.

For a function f, all available methods can be obtained with f.methods:

>>> f.methods
{Signature(builtins.str): (<function __main__.f(x:str)>, builtins.object),
 Signature(builtins.int): (<function __main__.f(x:int)>, builtins.object),
 Signature(numbers.Number): (<function __main__.f(x:numbers.Number)>,
  builtins.object)}

In the values, the first element in the tuple is the implementation and the second element the return type.

For an excellent and way more detailed overview of multiple dispatch, see the manual of the Julia Language.

Scope of Functions

Consider the following package design.

package/__init__.py

import a
import b

package/a.py

from plum import dispatch

@dispatch
def f(x: int):
   return "int"

package/b.py

from plum import dispatch

@dispatch
def f(x: float):
   return "float"

In a design like this, the methods for f recorded by dispatch are global:

>>> from package.a import f

>>> f(1.0)
'float'

This could be what you want, but it can also be undesirable, because it means that someone could accidentally overwrite your methods. To keep your functions private, you can create new dispatchers:

package/__init__.py

import a
import b

package/a.py

from plum import Dispatcher

dispatch = Dispatcher()


@dispatch
def f(x: int):
   return "int"

package/b.py

from plum import Dispatcher

dispatch = Dispatcher()


@dispatch
def f(x: float):
   return "float"
>>> from package.a import f

>>> f(1)
'int'

>>> f(1.0)
NotFoundLookupError: For function "f", signature Signature(builtins.float) could not be resolved.

>>> from package.b import f

>>> f(1)
NotFoundLookupError: For function "f", signature Signature(builtins.int) could not be resolved.

>>> f(1.0)
'float'

Classes

You can use dispatch within classes:

from plum import dispatch

class Real:
   @dispatch
   def __add__(self, other: int):
      return "int added"
   
   @dispatch
   def __add__(self, other: float):
      return "float added"
>>> real = Real()

>>> real + 1
'int added'

>>> real + 1.0
'float added'

If you use other decorators, then dispatch must be the outermost decorator:

class Real:
   @dispatch
   @decorator
   def __add__(self, other: int):
      return "int added"

@staticmethod, @classmethod, and @property.setter

In the case of @staticmethod, @classmethod, or @property.setter, the rules are different:

  1. The @dispatch decorator must be applied before @staticmethod, @classmethod, and @property.setter. This means that @dispatch is then not the outermost decorator.
  2. The class must have at least one other method where @dispatch is the outermost decorator. If this is not the case, you will need to add a dummy method, as the following example illustrates.
from plum import dispatch

class MyClass:
    def __init__(self):
        self._name = None
       
    @property
    def property(self):
        return self._name

    @property.setter
    @dispatch
    def property(self, value: str):
        self._name = value
      
    @staticmethod
    @dispatch
    def f(x: int):
        return x

    @classmethod
    @dispatch
    def g(cls: type, x: float):
        return x

    @dispatch
    def _(self):
        # Dummy method that needs to be added whenever no method has
        # `@dispatch` as the outermost decorator.
        pass

If you don't add the dummy method whenever it is required, you will run into a ResolutionError:

from plum import dispatch

class MyClass:
    @staticmethod
    @dispatch
    def f(x: int):
        return x
>>> MyClass.f(1)
ResolutionError: Promise `Promise()` was not kept.

Forward References

Imagine the following design:

from plum import dispatch

class Real:
    @dispatch
    def __add__(self, other: Real):
        pass # Do something here. 

If we try to run this, we get the following error:

NameError                                 Traceback (most recent call last)
<ipython-input-1-2c6fe56c8a98> in <module>
      1 from plum import dispatch
      2
----> 3 class Real:
      4     @dispatch
      5     def __add__(self, other: Real):

<ipython-input-1-2c6fe56c8a98> in Real()
      3 class Real:
      4     @dispatch
----> 5     def __add__(self, other: Real):
      6         pass # Do something here.

NameError: name 'Real' is not defined

The problem is that name Real is not yet defined, when __add__ is defined and the type hint for other is set. To circumvent this issue, you can use a forward reference:

from plum import dispatch

class Real:
    @dispatch
    def __add__(self, other: "Real"):
        pass # Do something here. 

Note: A forward reference "A" will resolve to the next defined class A in which dispatch is used. This works fine for self references. In is recommended to only use forward references for self references. For more advanced use cases of forward references, you can use plum.type.PromisedType.

Keyword Arguments and Default Values

Default arguments can be used. The type annotation must match the default value otherwise an error is thrown. As the example below illustrates, different default values can be used for different methods:

from plum import dispatch

@dispatch
def f(x: int, y: int = 3):
    return y


@dispatch
def f(x: float, y: float = 3.0):
    return y
>>> f(1)
3

>>> f(1.0)
3.0

>>> f(1.0, 4.0)
4.0

>>> f(1.0, y=4.0)
4.0

Keyword-only arguments, separated by an asterisk from the other arguments, can also be used, but are not dispatched on.

Example:

from plum import dispatch

@dispatch
def f(x, *, option="a"):
    return option
>>> f(1)
'a'

>>> f(1, option="b")
'b'

>>> f(1, "b")  # This will not work, because `option` must be given as a keyword.
NotFoundLookupError: For function "f", signature Signature(builtins.int, builtins.str) could not be resolved.

Comparison with multipledispatch

As an alternative to Plum, there is multipledispatch, which also is a great solution. Plum was developed to provide a slightly more featureful implementation of multiple dispatch.

Like multipledispatch, Plum's caching mechanism is optimised to minimise overhead.

from multipledispatch import dispatch as dispatch_md
from plum import dispatch as dispatch_plum

@dispatch_md(int)
def f_md(x):
   return x


@dispatch_plum
def f_plum(x: int):
   return x


def f_native(x):
    return x
>>> f_md(1); f_plum(1);  # Run once to populate cache.

>>> %timeit f_native(1)
82.4 ns ± 0.162 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

>>> %timeit f_md(1)
845 ns ± 77.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

>>> %timeit f_plum(1)
404 ns ± 2.83 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Plum synergises with OOP.

Consider the following snippet:

from multipledispatch import dispatch

class A:
    def f(self, x):
        return "fallback"
        

class B:
    @dispatch(int)
    def f(self, x):
        return x
>>> b = B()

>>> b.f(1)
1

>>> b.f("1")
NotImplementedError: Could not find signature for f: <str>

This behaviour might be undesirable: since B.f isn't matched, we could want A.f to be tried next. Plum supports this:

from plum import dispatch

class A:
    def f(self, x):
        return "fallback"


class B(A):
    @dispatch
    def f(self, x: int):
        return x
>>> b = B()

>>> b.f(1)
1

>>> b.f("1")
'fallback'

Plum supports forward references.

Plum supports parametric types from typing.

Plum attempts to stay close to Julia's type system.

For example, multipledispatch's union type is not a true union type:

from multipledispatch import dispatch

@dispatch((object, int), int)
def f(x, y):
    return "first"
    

@dispatch(int, object)
def f(x, y):
    return "second"
>>> f(1, 1)
'first'

Because the union of object and int is object, f(1, 1) should raise an ambiguity error! For example, compare with Julia:

julia> f(x::Union{Any, Int}, y::Int) = "first"
f (generic function with 1 method)

julia> f(x::Int, y::Any) = "second"
f (generic function with 2 methods)

julia> f(3, 3)
ERROR: MethodError: f(::Int64, ::Int64) is ambiguous. Candidates:
  f(x, y::Int64) in Main at REPL[1]:1
  f(x::Int64, y) in Main at REPL[2]:1

Plum does provide a true union type:

from typing import Union

from plum import dispatch

@dispatch
def f(x: Union[object, int], y: int):
    return "first"


@dispatch
def f(x: int, y: object):
    return "second"
>>> f(1, 1)
AmbiguousLookupError: For function "f", signature Signature(builtins.int, builtins.int) is ambiguous among the following:
  Signature(builtins.object, builtins.int) (precedence: 0)
  Signature(builtins.int, builtins.object) (precedence: 0)

Just to sanity check that things are indeed working correctly:

>>> f(1.0, 1)
'first'

>>> f(1, 1.0)
'second'

Plum implements method precedence.

Method precedence can be a very powerful tool to simplify more complicated designs.

Plum provides generic convert and promote functions.

Type System

Union Types

typing.Union can be used to instantiate union types:

from typing import Union

from plum import dispatch

@dispatch
def f(x):
    return "fallback"


@dispatch
def f(x: Union[int, str]):
    return "int or str"
>>> f(1)
'int or str'

>>> f("1")
'int or str'

>>> f(1.0)
'fallback'

Parametric Types

The parametric types typing.Tuple, typing.List, typing.Dict, typing.Iterable, and typing.Sequence can be used to dispatch on respectively tuples, lists, dictionaries, iterables, and sequence with particular types of elements. Importantly, the type system is covariant, as opposed to Julia's type system, which is invariant.

Example involving some parametric types:

from typing import Union, Tuple, List, Dict

from plum import dispatch

@dispatch
def f(x: Union[tuple, list]):
    return "tuple or list"
    
    
@dispatch
def f(x: Tuple[int, int]):
    return "tuple of two ints"
    
    
@dispatch
def f(x: List[int]):
    return "list of int"


@dispatch
def f(x: Dict[int, str]):
   return "dict of int to str"
>>> f([1, 2])
'list of int'

>>> f([1, "2"])
'tuple or list'

>>> f((1, 2))
'tuple of two ints'

>>> f((1, 2, 3))
'tuple or list'

>>> f((1, "2"))
'tuple or list'

>>> f({1: "2"})
'dict of int to str'

Note: Although parametric types are supported, parametric types do incur a significant performance hit, because the type of every element in a list or tuple must be checked. It is recommended to use parametric types only where absolutely necessary.

Variable Arguments

A variable number of arguments can be used without any problem.

from plum import dispatch

@dispatch
def f(x: int):
    return "single argument"
    

@dispatch
def f(x: int, *xs: int):
    return "multiple arguments"
>>> f(1)
'single argument'

>>> f(1, 2)
'multiple arguments'

>>> f(1, 2, 3)
'multiple arguments'

Return Types

Return types can be used without any problem.

from typing import Union

from plum import dispatch, add_conversion_method

@dispatch
def f(x: Union[int, str]) -> int:
    return x
>>> f(1)
1

>>> f("1")
TypeError: Cannot convert a "builtins.str" to a "builtins.int".

>>> add_conversion_method(type_from=str, type_to=int, f=int)

>>> f("1")
1

Conversion and Promotion

Conversion

The function convert can be used to convert objects of one type to another:

from numbers import Number

from plum import convert


class Rational:
    def __init__(self, num, denom):
        self.num = num
        self.denom = denom
>>> convert(0.5, Number)
0.5

>>> convert(Rational(1, 2), Number)
TypeError: Cannot convert a "__main__.Rational" to a "numbers.Number".

The TypeError indicates that convert does not know how to convert a Rational to a Number. Let us implement that conversion:

from operator import truediv

from plum import conversion_method
        

@conversion_method(type_from=Rational, type_to=Number)
def rational_to_number(q):
    return truediv(q.num, q.denom)
>>> convert(Rational(1, 2), Number)
0.5

Instead of the decorator conversion_method, one can also use add_conversion_method:

from plum import add_conversion_method

add_conversion_method(type_from, type_to, conversion_function)

Promotion

The function promote can be used to promote objects to a common type:

from plum import dispatch, promote, add_promotion_rule, add_conversion_method

@dispatch
def add(x, y):
    return add(*promote(x, y))
    
    
@dispatch
def add(x: int, y: int):
    return x + y
    
    
@dispatch
def add(x: float, y: float):
    return x + y
>>> add(1, 2)
3

>>> add(1.0, 2.0)
3.0

>>> add(1, 2.0)
TypeError: No promotion rule for "builtins.int" and "builtins.float".

>>> add_promotion_rule(int, float, float)

>>> add(1, 2.0)
TypeError: Cannot convert a "builtins.int" to a "builtins.float".

>>> add_conversion_method(type_from=int, type_to=float, f=float)

>>> add(1, 2.0)
3.0

Advanced Features

Abstract Function Definitions

A function can be abstractly defined using dispatch.abstract. When a function is abstractly defined, the function is created, but no methods are defined.

from plum import dispatch

@dispatch.abstract
def f(x):
    pass
>>> f
<function <function f at 0x7f9f6820aea0> with 0 method(s)>

>>> @dispatch
... def f(x: int):
...     pass

>>> f
<function <function f at 0x7f9f6820aea0> with 1 method(s)>

Method Precedence

The keyword argument precedence can be set to an integer value to specify precedence levels of methods, which are used to break ambiguity:

from plum import dispatch

class Element:
    pass


class ZeroElement(Element):
    pass


class SpecialisedElement(Element):
    pass


@dispatch
def mul_no_precedence(a: ZeroElement, b: Element):
    return "zero"


@dispatch
def mul_no_precedence(a: Element, b: SpecialisedElement):
    return "specialised operation"
    

@dispatch(precedence=1)
def mul(a: ZeroElement, b: Element):
    return "zero"


@dispatch
def mul(a: Element, b: SpecialisedElement):
    return "specialised operation"
>>> zero = ZeroElement()

>>> specialised_element = SpecialisedElement()

>>> element = Element()

>>> mul(zero, element)
'zero'

>>> mul(element, specialised_element)
'specialised operation'

>>> mul_no_precedence(zero, specialised_element)
AmbiguousLookupError: For function "mul_no_precedence", signature Signature(__main__.ZeroElement, __main__.SpecialisedElement) is ambiguous among the following:
  Signature(__main__.ZeroElement, __main__.Element) (precedence: 0)
  Signature(__main__.Element, __main__.SpecialisedElement) (precedence: 0)

>>> mul(zero, specialised_element)
'zero'

The method precedences of all implementations of a function can be obtained with the attribute precedences:

>>> mul_no_precedence.precedences
{Signature(__main__.ZeroElement, __main__.Element): 0,
 Signature(__main__.Element, __main__.SpecialisedElement): 0}

>>> mul.precedences
{Signature(__main__.ZeroElement, __main__.Element): 1,
 Signature(__main__.Element, __main__.SpecialisedElement): 0}

Parametric Classes

The decorator @parametric can be used to create parametric classes:

from plum import dispatch, parametric

@parametric
class A:
    def __init__(self, x, *, y = 3):
        self.x = x
        self.y = y
    
    
@dispatch
def f(x: A):
    return "fallback: x={}".format(x.x)
    
    
@dispatch
def f(x: A[int]):
    return "int x={}".format(x.x)
    
    
@dispatch
def f(x: A[float]):
    return "float x={}".format(x.x)
>>> A
__main__.A

>>> A[int]
__main__.A[builtins.int]

>>> issubclass(A[int], A)
True

>>> type(A(1)) == A[int]
True

>>> A[int](1)
<__main__.A[builtins.int] at 0x10c2bab70>

>>> f(A[int](1))
'int x=1'

>>> f(A(1))
'int x=1'

>>> f(A(1.0))
'float x=1.0'

>>> f(A(1 + 1j))
'fallback: x=1+1j'

Note: Calling A[pars] on parametrized type A instantiates the concrete type with parameters pars. If A(args) is called directly, the concrete type is first instantiated by taking the type of all positional arguments, and then an instance of the type is created.

This behaviour can be customized by overriding the @classmethod __infer_type_parameter__ of the parametric class. This method must return the type parameter or a tuple of type parameters.

from plum import parametric

@parametric
class NTuple:
    @classmethod
    def __infer_type_parameter__(self, *args):
        # Mimicks the type parameters of an `NTuple`.
        T = type(args[0])
        N = len(args)
        return (N, T)

    def __init__(self, *args):
        # Check that the arguments satisfy the type specification.
        T = type(self)._type_parameter[1]
        assert all(isinstance(val, T) for val in args)
        self.args = args
>>> type(NTuple(1, 2, 3))
__main__.NTuple[3, <class 'int'>]

Hooking Into Type Inference

With parametric classes, you can hook into Plum's type inference system to do cool things! Here's an example which introduces types for NumPy arrays of particular ranks:

import numpy as np
from plum import dispatch, parametric, type_of


@parametric(runtime_type_of=True)
class NPArray(np.ndarray):
    """A type for NumPy arrays where the type parameter specifies the number of
    dimensions."""


@type_of.dispatch
def type_of(x: np.ndarray):
    # Hook into Plum's type inference system to produce an appropriate instance of
    # `NPArray` for NumPy arrays.
    return NPArray[x.ndim]


@dispatch
def f(x: NPArray[1]):
    return "vector"


@dispatch
def f(x: NPArray[2]):
    return "matrix"
>>> f(np.random.randn(10))
'vector'

>>> f(np.random.randn(10, 10))
'matrix'

>>> f(np.random.randn(10, 10, 10))
NotFoundLookupError: For function "f", signature Signature(__main__.NPArray[3]) could not be resolved.

Add Multiple Methods

Dispatcher.multi can be used to implement multiple methods at once:

from typing import Union

from plum import dispatch

@dispatch.multi((int, int), (float, float))
def add(x: Union[int, float], y: Union[int, float]):
    return x + y
>>> add(1, 1)
2

>>> add(1.0, 1.0)
2.0

>>> add(1, 1.0)
NotFoundLookupError: For function "add", signature Signature(builtins.int, builtins.float) could not be resolved.

Extend a Function From Another Package

Function.dispatch can be used to extend a particular function from an external package:

from package import f

@f.dispatch
def f(x: int):
    return "new behaviour"
>>> f(1.0)
'old behaviour'

>>> f(1)
'new behaviour'

Directly Invoke a Method

Function.invoke can be used to invoke a method given types of the arguments:

from plum import dispatch

@dispatch
def f(x: int):
    return "int"
    
    
@dispatch
def f(x: str):
    return "str"
>>> f(1)
'int'

>>> f("1")
'str'

>>> f.invoke(int)("1")
'int'

>>> f.invoke(str)(1)
'str'

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

plum-dispatch-1.5.10.tar.gz (49.4 kB view details)

Uploaded Source

Built Distributions

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

plum_dispatch-1.5.10-pp37-pypy37_pp73-win_amd64.whl (103.2 kB view details)

Uploaded PyPyWindows x86-64

plum_dispatch-1.5.10-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (128.0 kB view details)

Uploaded PyPymanylinux: glibc 2.12+ x86-64manylinux: glibc 2.5+ x86-64

plum_dispatch-1.5.10-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (129.4 kB view details)

Uploaded PyPymanylinux: glibc 2.12+ i686manylinux: glibc 2.5+ i686

plum_dispatch-1.5.10-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (114.7 kB view details)

Uploaded PyPymacOS 10.9+ x86-64

plum_dispatch-1.5.10-cp310-cp310-win_amd64.whl (118.8 kB view details)

Uploaded CPython 3.10Windows x86-64

plum_dispatch-1.5.10-cp310-cp310-win32.whl (109.2 kB view details)

Uploaded CPython 3.10Windows x86

plum_dispatch-1.5.10-cp310-cp310-musllinux_1_1_x86_64.whl (588.9 kB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ x86-64

plum_dispatch-1.5.10-cp310-cp310-musllinux_1_1_i686.whl (565.8 kB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ i686

plum_dispatch-1.5.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (523.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.12+ x86-64manylinux: glibc 2.5+ x86-64

plum_dispatch-1.5.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (504.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.12+ i686manylinux: glibc 2.5+ i686

plum_dispatch-1.5.10-cp310-cp310-macosx_11_0_arm64.whl (136.9 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

plum_dispatch-1.5.10-cp310-cp310-macosx_10_9_x86_64.whl (151.4 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

plum_dispatch-1.5.10-cp39-cp39-win_amd64.whl (120.3 kB view details)

Uploaded CPython 3.9Windows x86-64

plum_dispatch-1.5.10-cp39-cp39-win32.whl (110.2 kB view details)

Uploaded CPython 3.9Windows x86

plum_dispatch-1.5.10-cp39-cp39-musllinux_1_1_x86_64.whl (588.3 kB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ x86-64

plum_dispatch-1.5.10-cp39-cp39-musllinux_1_1_i686.whl (566.9 kB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ i686

plum_dispatch-1.5.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (532.2 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64manylinux: glibc 2.5+ x86-64

plum_dispatch-1.5.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (511.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ i686manylinux: glibc 2.5+ i686

plum_dispatch-1.5.10-cp39-cp39-macosx_11_0_arm64.whl (134.1 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

plum_dispatch-1.5.10-cp39-cp39-macosx_10_9_x86_64.whl (148.5 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

plum_dispatch-1.5.10-cp38-cp38-win_amd64.whl (120.4 kB view details)

Uploaded CPython 3.8Windows x86-64

plum_dispatch-1.5.10-cp38-cp38-win32.whl (110.4 kB view details)

Uploaded CPython 3.8Windows x86

plum_dispatch-1.5.10-cp38-cp38-musllinux_1_1_x86_64.whl (645.8 kB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ x86-64

plum_dispatch-1.5.10-cp38-cp38-musllinux_1_1_i686.whl (617.9 kB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ i686

plum_dispatch-1.5.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (577.2 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64manylinux: glibc 2.5+ x86-64

plum_dispatch-1.5.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (554.4 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ i686manylinux: glibc 2.5+ i686

plum_dispatch-1.5.10-cp38-cp38-macosx_11_0_arm64.whl (134.1 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

plum_dispatch-1.5.10-cp38-cp38-macosx_10_9_x86_64.whl (146.6 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

plum_dispatch-1.5.10-cp37-cp37m-win_amd64.whl (117.9 kB view details)

Uploaded CPython 3.7mWindows x86-64

plum_dispatch-1.5.10-cp37-cp37m-win32.whl (107.9 kB view details)

Uploaded CPython 3.7mWindows x86

plum_dispatch-1.5.10-cp37-cp37m-musllinux_1_1_x86_64.whl (532.6 kB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ x86-64

plum_dispatch-1.5.10-cp37-cp37m-musllinux_1_1_i686.whl (505.8 kB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ i686

plum_dispatch-1.5.10-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (473.7 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64manylinux: glibc 2.5+ x86-64

plum_dispatch-1.5.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (450.6 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ i686manylinux: glibc 2.5+ i686

plum_dispatch-1.5.10-cp37-cp37m-macosx_10_9_x86_64.whl (144.6 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

plum_dispatch-1.5.10-cp36-cp36m-win_amd64.whl (124.1 kB view details)

Uploaded CPython 3.6mWindows x86-64

plum_dispatch-1.5.10-cp36-cp36m-win32.whl (112.2 kB view details)

Uploaded CPython 3.6mWindows x86

plum_dispatch-1.5.10-cp36-cp36m-musllinux_1_1_x86_64.whl (536.0 kB view details)

Uploaded CPython 3.6mmusllinux: musl 1.1+ x86-64

plum_dispatch-1.5.10-cp36-cp36m-musllinux_1_1_i686.whl (506.4 kB view details)

Uploaded CPython 3.6mmusllinux: musl 1.1+ i686

plum_dispatch-1.5.10-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (474.0 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ x86-64manylinux: glibc 2.5+ x86-64

plum_dispatch-1.5.10-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (454.6 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ i686manylinux: glibc 2.5+ i686

plum_dispatch-1.5.10-cp36-cp36m-macosx_10_9_x86_64.whl (144.4 kB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

File details

Details for the file plum-dispatch-1.5.10.tar.gz.

File metadata

  • Download URL: plum-dispatch-1.5.10.tar.gz
  • Upload date:
  • Size: 49.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.4

File hashes

Hashes for plum-dispatch-1.5.10.tar.gz
Algorithm Hash digest
SHA256 6d3a65163bf9a697ad2a2f64e572a004e3c467c8d60db157363b103124db4c52
MD5 0bfef7a3208d770a8e9f2faec4308c51
BLAKE2b-256 685bbdf6b62c92637497a55ca408086c420324547a529283a87c0c4ee1ad2b0f

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-pp37-pypy37_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-pp37-pypy37_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 f7ef842b3083a97cd8e9ad5b2426b5817b925e9500c09aceb637c07353f48e43
MD5 d0232f891c6e0ac96c944396c9850920
BLAKE2b-256 7575b175301bc77d36d0cd8eed24f0577d6a31a29159972382f1ad5d40579fed

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 bc9c5dafecd02be19929635af2b9abba194d9dc1f355f6e30a86864f2701fd44
MD5 c287a8df3d6111109b6e8db1f32ddab4
BLAKE2b-256 2026faeb17499e3d7368ab7963859b4ac7ef4f8ba6fc9eef626fe957b956d4a0

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 0c3559a2d3d9b025d9e3550afcf14d33b5ca9f04819ec529ac03f2c0a65ac1af
MD5 3ae99ccdb3c9157ae709f76e13846d06
BLAKE2b-256 a002db6de010d433e1fe8ab5298a7ac6c9b45092dd1567f7f8e6dadd737ce5f0

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-pp37-pypy37_pp73-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0a4df2d8743f802cbe291bd56b00081710867559e617bb199d2e49d811bd0f3d
MD5 621a8e7d5e98857e29534f0065bfa4ce
BLAKE2b-256 73d854d2cc49fd79acc5bf075cac3034bba404d532d89ac601f907ceffa21e87

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 985e12026739b2073ab89c089408072554649c75cc57bd931e89737f58a300e5
MD5 38455d6a4c83382c98bb2e6971441d5e
BLAKE2b-256 47155b916591fea4ea8b778dcb21318ed74c78bc4decaccc9929331fb6d055d3

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp310-cp310-win32.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 90c756096dcc2bb171c158b0acf1fbc446422329dd38af03077329e5abc50f78
MD5 d9a73f90ee23865ca184f300b1491495
BLAKE2b-256 06d7f47eb8ffd21b5f98a4cbca288dafe26219a862261b979ec6fea4d2ef33cf

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 fd5a2050fb59986bd5054cb6415f0167621237eac26ae880426d3b9842e3defe
MD5 5817a0ff00eaf1f2ec085fb5cb550f7f
BLAKE2b-256 6e7e0f4ce397ade7e96d0bbe2f3279d758be0a15a2139377acf28fcea50f2deb

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp310-cp310-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp310-cp310-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 843e71b9ebe8d552a5a38e1da6c14815b7e24065b17624c343d8d3de1621ee9b
MD5 10495aa6b9745a026bbfee8789e288fd
BLAKE2b-256 00348f06e4136c265a615c889d2de35630086804682b912c3c68aaea2980e3fd

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 11af53774ecfcb7fc0b10996c97ad0614ad894efc4e7774c54dafe79a11acdf7
MD5 6f05c5fc86b52a38b5c14c2c563bee96
BLAKE2b-256 cfc087ea3d575cf384de202dec61526c61bca7747f5e302510bc62ef5778f2a6

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 54b501fec49058eab40a73b49d5245e4787b8d43bcee5d070fdc8dfdd5b68273
MD5 c8db31fbf7ad965990994dee55b51b7c
BLAKE2b-256 d40ccc8b2c11be1ce8d58a5c4894b737087a05e717234c7a1d0bb492fe72e3b4

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c43e84cedbd201b512acf3d7af5cbc32461c2d47ad70deec392d58549f046428
MD5 d651aba8ecf4d7f5960f5c2a18c6f327
BLAKE2b-256 d80acea415ecfcc386272e0de5f3ea29bc691e4d922225657500c77bbc88795f

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6c43c88f1225bbfd470524c61bef022222e8bfe0ad4f3d20f10e33e1509d5300
MD5 bebc9685fef8f92fcc9748a25c4aeed3
BLAKE2b-256 e7f2376c2a8db706e9cff120e240446abbfad23dd3fa4220034450d11c57dd6f

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 13ad2a3774cc13f10afc2145d8200cfaf5eb7ee8ef36fd992423c490f4661458
MD5 44e9bfff9e3a9fb342a73044e287519b
BLAKE2b-256 50ff87ff2e50447d2c74e4708e15b79899d1303e945793ba2131c82cc332939b

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp39-cp39-win32.whl.

File metadata

  • Download URL: plum_dispatch-1.5.10-cp39-cp39-win32.whl
  • Upload date:
  • Size: 110.2 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.10

File hashes

Hashes for plum_dispatch-1.5.10-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 1cdcc40b659ec0166166b5bb32054af54f65445da179283ad3de7cf89d759ddf
MD5 5e5acf0cbf51f11fb9501bd2e4ddb820
BLAKE2b-256 63130b22cbc92eb5a91e037fa1eef0e9369151209c894d94a18bdcc8e1014ced

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp39-cp39-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 e13f04f7d7989187e8c3d82cbf0307a0b7e4d1509bcced35521fff9a376b7c51
MD5 1371d2bbad8075a022657178bb61e571
BLAKE2b-256 21387387822032cd12601af4ff74730bd4dc916a794a485b916140404b0b9caf

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp39-cp39-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp39-cp39-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 bd22295181972a05e3db6c3369bc52622887818df7a56f528f7e7af180b9e2ec
MD5 9937a0d7d05c9137723de112aaa48ff1
BLAKE2b-256 5543cce83fc9dded31d1f2e7ff5b767eb3fc810e3250956cd893ae700b67c86a

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 488694161d71203fe1a831204072cb57a354375db1fc3e461cd9714ee120ba25
MD5 d188f2d529fe354dbdc88ca6beeadb6a
BLAKE2b-256 5ead2cba1a0d7033bba44781ad82841ead847d4252792b539cfa517016560e37

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 99f0fc6beb514ea266946b9af753e0b3d7d7511bbda715f626d590f8b5ecb6bc
MD5 696e7086bbbde4a75a584277f6c0e20a
BLAKE2b-256 00f77fec96c3aa54c3f24deb29084031ac6bb28c57c015e8dbaba8a30b9e63ab

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c1f58d1d51fc1dbc1c43781ef26d9174e552ea92f5849e067400a5a7462af730
MD5 86bf3a11b911e4e18bd615872e01099c
BLAKE2b-256 304da9efc869847dc1675bc184d9f7316e1ef5d7b93df37685ce31f41216b009

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d2c2628c0007f6f518109c9e451722ee75094a4a8554b8bcbd69ed1bc397daa8
MD5 da8f7b14fabf2b0cde443a5c26224908
BLAKE2b-256 d9f3aa2cb514036a73c6997cec43eb3f413837807f4d2a6a5120fbebee03d793

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 adb2961b27e04b7b92b787ac03c966af0c5571ceb225bb9947254c92f2c181c3
MD5 67f3b15ab7109a7c1ef4e370e11f5245
BLAKE2b-256 388d0223d23177adb7dcaa7220e278a61718fb1b0af7fde5f2be08c28fd18cb9

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp38-cp38-win32.whl.

File metadata

  • Download URL: plum_dispatch-1.5.10-cp38-cp38-win32.whl
  • Upload date:
  • Size: 110.4 kB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.10

File hashes

Hashes for plum_dispatch-1.5.10-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 b5dab1c36d4c46f1f058da4b27f8044000281d5d565c97ffa8e835f0b6e03933
MD5 5b08d4544b9a0ef3bd1cb6c2c06d54c4
BLAKE2b-256 a191a43e959bf802c39a051f6d7dbe7c93bf259a0b52d54d414da18a7bb39462

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp38-cp38-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 3219ed9e9cba27964852ed373ae2c45ee431d08d9717a1a1775daf1a546f7cf3
MD5 1d9651fd67497deba108c16b3c9ba387
BLAKE2b-256 b5097a2061478c1f55eebdab21fb0f020aaca206b52b2f6a76cdf75d8cff5818

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp38-cp38-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp38-cp38-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 c43ad7024cb06f21f3ccd2c2ecb103e737387b39f662c4a4af0dd9b6cca50cdc
MD5 00afb6882fa2c623b9e0c91670dc21a7
BLAKE2b-256 ca38765340fca4ca7d4c9a4898f5ad3d02eff86a3c99df880ac98c401e203318

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 c847731af013b4beaba03ddfd7a6a396f0ad1369b7b1742bcf0583395d384bfa
MD5 f676a62231437f4ab4c287faac46fbd3
BLAKE2b-256 5b2769c9f0a9aeb998d016d62fd72121f619bac44eb30d4782dd0107eb939ac6

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 01ddbb42ed8f1f0f659ca47b2e0ede37e8ed1a1a6f753d9861b77d7a16973283
MD5 81d0a656cfc1b110013f8731143098ee
BLAKE2b-256 dd661cf82892742dfe5cb3f6fd11c4b170d4afd19a392a3ebbbd3d0f494638fa

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5a3308aa0d160deec670193d267b2f3a30df465e41acaa8ae62cacc8b9af00d8
MD5 be45c66118061596835b9b99b346e5fb
BLAKE2b-256 572119d298566bd81f507342768c4cf20219d1ec49a64cdc636c8813acf158d2

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e97ca20fb9b0dc5222dc507150a36a1e30a83f01ce67f3babc63a0cfa2046106
MD5 95d94fa6c31a4ae86c0fda5b6c9774cb
BLAKE2b-256 34e46e122c29f92d1ded2db93baa86d682867e26ad09cbbe4b8bffd0449c2189

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 dced0558febef5922f3bf8f8a1563e9ae25402a4d960f7967ba3ede8a0ea05dd
MD5 5dfcd730962644b2eef4fd3425f320fc
BLAKE2b-256 d78241f4a2352a25bbdf618793ac55724b419abd0939272e178f358c250f249d

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp37-cp37m-win32.whl.

File metadata

  • Download URL: plum_dispatch-1.5.10-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 107.9 kB
  • Tags: CPython 3.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.10

File hashes

Hashes for plum_dispatch-1.5.10-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 de9675f163dc1975094b9c0235f548104280d88b5063f6b5e956fc64095aad55
MD5 3d729751643426e998d668e521e1ac2b
BLAKE2b-256 61d0d890a3c73b56096e101ac334a8e6c1364eada2d5a8350779d4101e4ceffc

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp37-cp37m-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 dc4ca7137fca146d9b469932909dd02af50e7766f316fbfdde857e14cd40b5b5
MD5 49a629b10dd1cd01ca010972e0528e1d
BLAKE2b-256 8a8b41033daa2dbb545537faeec6fcd7367e6bf67ecce8e13327822adbda1bcc

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp37-cp37m-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 a5d8a1b0c8bb52ef10a49c9fd9486d8883f2141d71bc3f24c3ceed724afdc601
MD5 e57f29817ba97b882a100265cfa917aa
BLAKE2b-256 485eb0c85a932382b37a0a73d991ea2db51cf9aa8e9d2c0a41850e352acf647a

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 97c11608c9689662a93ed0af944600443156f2729a73561673cddb897ab48a32
MD5 fceb0c5f966bb10067ebe5a29acdc13a
BLAKE2b-256 90f19a00aef1ee46ddff324b44260788e35ccdba64030b6a316af23d7562d675

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 b7f750ab3f5995f025ca42a931325fce095b1e93443b439cce863f55a0c33d2c
MD5 cfdc44fe853204482797ae37ff4b17e9
BLAKE2b-256 176285395454b0590f0c7cfefd9bde635dd08ac0903a903042740a627265ddd0

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 22dc8a5254255bb28c861d7667d44866886f640d23a88b349d33d98e5291ec6a
MD5 583d99c600e94b487c22afe17bd059a5
BLAKE2b-256 d3e457568d082de8e9d915fa16785505805946b29ca0f5b136bc5091e16c3586

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp36-cp36m-win_amd64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 a94848bb651fc73a1f2cf6faf5b8debddde2d965504db0cde4f4767259a50a8f
MD5 da628683206ff98ca9dd229434aeec3e
BLAKE2b-256 5b343928a0551dd4da8099775f8f78233413f790b161e0cb15d63d5d32bb38f1

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp36-cp36m-win32.whl.

File metadata

  • Download URL: plum_dispatch-1.5.10-cp36-cp36m-win32.whl
  • Upload date:
  • Size: 112.2 kB
  • Tags: CPython 3.6m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.10

File hashes

Hashes for plum_dispatch-1.5.10-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 61781c04c9c4aa8f027c5c4b067449752c8d8efda7daffb9b3015859d9338b2b
MD5 62998c2ba4a847f9aa4ab29b68f7ef38
BLAKE2b-256 768360b04217cd840e24aabe28c89931cd5879b770186a8ef1aa790a06250038

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp36-cp36m-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp36-cp36m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 bb237e2a66e8b9235aecde64ba74f36a1e4b156853f67ca93eae1dbba187f103
MD5 4d0bd1efee9d4adbd6d9cfed4de63c4e
BLAKE2b-256 8da877fe389aad98757a490da91cbb60434df8eb8101c1ec0a8c8fa1ba0cc840

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp36-cp36m-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp36-cp36m-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 230fa14d3bf8c78dea3d4e9cf241b079fc2ffed867ad3d30cc33538c9638c9c7
MD5 bdfbaf02e4d64f0fc75c298b19587aad
BLAKE2b-256 dbd96f468050d840c35df358fbde90f273db1ba558d200873614d8e1817a54bb

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 01bdb718348e714dcbd0ab7253232893a9b3701193168d8e457aa61a4db28675
MD5 dad22fdf364cff86ae292c9c86ba5913
BLAKE2b-256 e6522e8c8446b616206ff69dfea352c92a607afabe43d0d3f543875ff3e099e0

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 5937d744447660921d9d6e152118b4034c9dd7b31399913c438ce8faea8bc13d
MD5 989c00165d513412e213c00745f76c1c
BLAKE2b-256 e4ce680be5577ba77ed4bf33d2a2fc80e4e35e4fb6e384117e53e699d87c6dc0

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.10-cp36-cp36m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for plum_dispatch-1.5.10-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a8a81d4ac92b16d67319db4eb27b7ea508a44abc97b509d8e18478a72eb7b6d1
MD5 bf34d92a052500b37bd1e9400ba80d96
BLAKE2b-256 f76258ac056db47f9a4677ceb14581972424a6b4ecb5cd471ba109e31a2e54d9

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