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.9.tar.gz (49.2 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.9-pp37-pypy37_pp73-win_amd64.whl (102.7 kB view details)

Uploaded PyPyWindows x86-64

plum_dispatch-1.5.9-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (127.6 kB view details)

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

plum_dispatch-1.5.9-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (129.0 kB view details)

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

plum_dispatch-1.5.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (114.3 kB view details)

Uploaded PyPymacOS 10.9+ x86-64

plum_dispatch-1.5.9-cp310-cp310-win_amd64.whl (120.1 kB view details)

Uploaded CPython 3.10Windows x86-64

plum_dispatch-1.5.9-cp310-cp310-win32.whl (109.8 kB view details)

Uploaded CPython 3.10Windows x86

plum_dispatch-1.5.9-cp310-cp310-musllinux_1_1_x86_64.whl (589.1 kB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ x86-64

plum_dispatch-1.5.9-cp310-cp310-musllinux_1_1_i686.whl (567.1 kB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ i686

plum_dispatch-1.5.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (530.5 kB view details)

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

plum_dispatch-1.5.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (510.9 kB view details)

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

plum_dispatch-1.5.9-cp310-cp310-macosx_11_0_arm64.whl (133.9 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

plum_dispatch-1.5.9-cp310-cp310-macosx_10_9_x86_64.whl (147.6 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

plum_dispatch-1.5.9-cp39-cp39-win_amd64.whl (119.8 kB view details)

Uploaded CPython 3.9Windows x86-64

plum_dispatch-1.5.9-cp39-cp39-win32.whl (109.7 kB view details)

Uploaded CPython 3.9Windows x86

plum_dispatch-1.5.9-cp39-cp39-musllinux_1_1_x86_64.whl (586.5 kB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ x86-64

plum_dispatch-1.5.9-cp39-cp39-musllinux_1_1_i686.whl (565.4 kB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ i686

plum_dispatch-1.5.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (530.0 kB view details)

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

plum_dispatch-1.5.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (510.3 kB view details)

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

plum_dispatch-1.5.9-cp39-cp39-macosx_11_0_arm64.whl (133.6 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

plum_dispatch-1.5.9-cp39-cp39-macosx_10_9_x86_64.whl (147.6 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

plum_dispatch-1.5.9-cp38-cp38-win_amd64.whl (119.9 kB view details)

Uploaded CPython 3.8Windows x86-64

plum_dispatch-1.5.9-cp38-cp38-win32.whl (109.9 kB view details)

Uploaded CPython 3.8Windows x86

plum_dispatch-1.5.9-cp38-cp38-musllinux_1_1_x86_64.whl (643.0 kB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ x86-64

plum_dispatch-1.5.9-cp38-cp38-musllinux_1_1_i686.whl (612.9 kB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ i686

plum_dispatch-1.5.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (576.5 kB view details)

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

plum_dispatch-1.5.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (552.3 kB view details)

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

plum_dispatch-1.5.9-cp38-cp38-macosx_11_0_arm64.whl (133.7 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

plum_dispatch-1.5.9-cp38-cp38-macosx_10_9_x86_64.whl (146.0 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

plum_dispatch-1.5.9-cp37-cp37m-win_amd64.whl (117.3 kB view details)

Uploaded CPython 3.7mWindows x86-64

plum_dispatch-1.5.9-cp37-cp37m-win32.whl (107.3 kB view details)

Uploaded CPython 3.7mWindows x86

plum_dispatch-1.5.9-cp37-cp37m-musllinux_1_1_x86_64.whl (530.7 kB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ x86-64

plum_dispatch-1.5.9-cp37-cp37m-musllinux_1_1_i686.whl (504.7 kB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ i686

plum_dispatch-1.5.9-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (472.5 kB view details)

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

plum_dispatch-1.5.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (451.3 kB view details)

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

plum_dispatch-1.5.9-cp37-cp37m-macosx_10_9_x86_64.whl (144.0 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

plum_dispatch-1.5.9-cp36-cp36m-win_amd64.whl (123.4 kB view details)

Uploaded CPython 3.6mWindows x86-64

plum_dispatch-1.5.9-cp36-cp36m-win32.whl (111.7 kB view details)

Uploaded CPython 3.6mWindows x86

plum_dispatch-1.5.9-cp36-cp36m-musllinux_1_1_x86_64.whl (531.9 kB view details)

Uploaded CPython 3.6mmusllinux: musl 1.1+ x86-64

plum_dispatch-1.5.9-cp36-cp36m-musllinux_1_1_i686.whl (505.8 kB view details)

Uploaded CPython 3.6mmusllinux: musl 1.1+ i686

plum_dispatch-1.5.9-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (473.2 kB view details)

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

plum_dispatch-1.5.9-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (452.8 kB view details)

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

plum_dispatch-1.5.9-cp36-cp36m-macosx_10_9_x86_64.whl (143.6 kB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for plum-dispatch-1.5.9.tar.gz
Algorithm Hash digest
SHA256 ae1f0e90a61112bcc6043697007f2e12aa48cedcaacf7eb0bea4ff27abc89872
MD5 4b23bae1d3ed0e2e05469985e9b5fc5d
BLAKE2b-256 da4501b7de183796fe70877658e84c870926f8eedad6ee617b9037fc989b51f8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-pp37-pypy37_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 b80f0334e793c4b4048dfc37f22ebb27f2bcbb706c5dbb9b3e6049386e68718a
MD5 92c2d980bdf0799a424740cd55c67bc6
BLAKE2b-256 9bf8ee22c0ff2e9a351a27e542ab35fe5465bfbd41cc7769fc7148f111905a7e

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.9-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.9-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 516bea9ab4f4501f93826a4569d079610fa98b246baa1cbbc3d16ab080bed2c5
MD5 816669984f03fdc346b4d5f43fbde7f3
BLAKE2b-256 0d92dba14f03e85a10d86505dd66ea334ce427c991a2a75462380e8f921d9e8c

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.9-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.9-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 f7da3676492570aeb417197dfccd3f1c27c1cee3d4cc754e68f2125e33630209
MD5 3e111051dd2397c68ac190706559cf15
BLAKE2b-256 2805480e9c3b753dabdb95de7540bed8c43216aee5a2693a623a2f5d69891c6d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4de27490403102f70907ff7ce479eaac8fffa7b251c98817482877a2d261136f
MD5 946ba8f2f6996c4f18a53b3aac1ebbca
BLAKE2b-256 708c1c0e64af350a3b8011657824ba9e7f87977936c8b501f2382b61ada6bf5c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 20fa6ae09227d409d822267289655658aae1cf2bb418a582038818bbd61d8327
MD5 3312ebc0e51abdfd9813c04e7f117010
BLAKE2b-256 838a30e297d50c6fa90898c093e2fe414c5143182ad8ac14cdca6793c990d3c9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: plum_dispatch-1.5.9-cp310-cp310-win32.whl
  • Upload date:
  • Size: 109.8 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.8.10

File hashes

Hashes for plum_dispatch-1.5.9-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 001bfbcd72f09ce412c08ec9a4254fab0e827fcea195207d2a51e54236cbe8db
MD5 158fb5ed4d40e5ade66cd92c8c54d039
BLAKE2b-256 cafe90610a942bd5e95d9ecfd3023f6ed7e8947ffe09b46b711a9e5c1b49fb92

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 059dbf977ff776535d68ac4d46810f0f9058719e2876734874a40e3ab25226f8
MD5 3f20b1fe89e3493b9d40c8939f391d99
BLAKE2b-256 b5dfe5e7f22e9addbd74d7bb2d983310261b90fe48d2ff50a0fad6da1b25a9ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp310-cp310-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 deda4622d65825213baf61108d613ac8101bc18d0d2ee1311c07a83ee56d5616
MD5 2e910bb306aa19c2167eca23813c448c
BLAKE2b-256 49c0de1ee121e791412528117fd07f346a29e029fc22e3b6450f12a21de5fa39

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.9-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.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 3990f637df997f5ad33f58b2c638e95531b2b9cb11fea748f855c760ff7c007b
MD5 d1a48575b0adc49ca0e3c44ea79213a5
BLAKE2b-256 71ca9f85a6e834b3ce35e18b002d17dad1ce2dba43736ea0b265b28afee76688

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.9-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.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 06945b67ed75cf7f436ba0f1b238b7cf681775b483d7c7ce28bb6636e68e1563
MD5 1cbd9c72788c74d1285c73224f5bfe5d
BLAKE2b-256 d1211077adec31355743c79e2ce198ba47f6cdd3ba6857b67f065c5c0affdfaa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 120fc4ca3044282eed92b84be98f8c883f8a68237b8ed82ecb81a5a89e8a03a4
MD5 f13cc285ee153f19b9381d77172687f6
BLAKE2b-256 34c34f0a21637c617a0b1af0bd3c148d4deea9c4c708a7275d99229c898754d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8a25fc419355dfb0e66e595b9bbcee5d7cd9458e135d16ef5768d682434cad03
MD5 8111ebed400a98153a28261772454555
BLAKE2b-256 f2f6b3d5b5099790757c3f3dfe0e46c1317c8284c7a87c3fb3a556f946920ea3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 675ca28ddab751d0ab076da18b6d648e727c35f3cd55dd7949517778398d1abc
MD5 ae458acb14395b031129b60f33f8fe1c
BLAKE2b-256 80812fe7febc5c34c949a129b91efce6ef08333ad7e934f80b47135a60c69465

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for plum_dispatch-1.5.9-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 75132042c89f373a54d6c71124e55cad6b823b8921ad4da56ce8723178a4cfc7
MD5 1fec51ebd947090515c6f13071cc8e2e
BLAKE2b-256 af6dfd3e44efbbd1fe7249549643574a504c1675b939ebf572e384035efa2f61

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 7f874b14581c8bc5bf6d05c199c4b0d9479dd3e741bf7ef8e89cd0aea0e0de57
MD5 c8faeaaafbb219fde7e7a8de6267a92b
BLAKE2b-256 7e4d4ad6d8f9c9366895ec40a7af6c44ef83f36030df3dad59fa26745f55f263

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp39-cp39-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 2b9bf4d549e220c1bdb7f80fe3b25b2159cf47f8ebfb2a79e84964415a26add8
MD5 23c117020deebc2d4cb94b43950423d6
BLAKE2b-256 2c3c7f50e1f759b60ac01dcd20fc2f1b8f0ccd7beb8aca754069759f39b529f4

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.9-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.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 56b8a08ee2acc6776a8323fef5d2f1f78b2897ce8c130bc688dc76de95ea0d01
MD5 79bae3ecae45b6e8c9b88a5d79d07a08
BLAKE2b-256 965c131f6057584681c5825fe9aa68ad37d0cf0e214c84dd86772bf6779382d7

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.9-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.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 0b358fe2216aabe6d84f32064730941d038bc6b358add19bdbe79c8ad7f193d7
MD5 a8559a2cbcbdf3fbf43feb6130aa0678
BLAKE2b-256 f2fb41891cbb480308d222ce3d5a2162dd6e29230ea0805d43f066b6b999fcc1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b4a42ea8a79028646cf8f7575c8d6181be1b15cebcfec91889c5c7b4be72c252
MD5 51b629efa981ff475bc938b63c947010
BLAKE2b-256 c424c280d01bfbb395ecbb174081429f27af32772fbc512577f96812c63b084a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 567b7940fdd9e96c5144b0c5545224ceadd9f56dd75ede638288d6e4579a93d7
MD5 3a11c47bfcde5718c9fe1c0fd8e8962f
BLAKE2b-256 47e9a93b57a508e1432e7f5570775c3a2f5d86156ebb6623e6951ded68c4e209

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 bf55eb0259cfe13497e20c797f9843b865d3a514687aafdd99917e8616aa528c
MD5 69f804a425586e45b6fb9a2e20436e03
BLAKE2b-256 02308fc552d3605a385bd1d157271d4827cbc25bd839eeaf96b9324cbf5d9094

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for plum_dispatch-1.5.9-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 a33663df24a440cfd12920c24ffa69c95b85c83076fb5cddeba46efdeb75a8a1
MD5 f8e79be183256730bf26ffdbc6aa7293
BLAKE2b-256 7983c5701fa02d184936b91ddce87357522b8c851e5ef6498de20486c38797fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 00b0ff47dfb965872ade5492c430046737d537e6ef5c3a4083d4211a3fbfbc88
MD5 9b4ef4287185e04142f237ad3761328a
BLAKE2b-256 6afaa9d4941d7928ca55a472a82afb1c46dc805b7ec700465f3c9c219f231521

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp38-cp38-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 15ede6ed1a2ffc663995f9a9dc2349ef6d3285a5537b2c87d95ec5d761e0f248
MD5 bbe9bdc4b88c163df0096dac834a59b5
BLAKE2b-256 aab0f411b26c024b920c0bce81f81ac498504c108024a2ea7cd6fe7be972add4

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.9-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.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 a7d529561e61e6585c481e156ede47469aa0fc839f6dfa28af338279ede39ea8
MD5 dc30408311c66043dd6d301d5b368448
BLAKE2b-256 d4529e426f57c65a26d0881126144d271f717e57ca6aec7bb19c05f35f361c3e

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.9-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.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 f24602609efade457098511fe43de0cd392a5876b8b28181ff5d02bed0acedfc
MD5 c14a27387f5d353d10d57c4bdf534e85
BLAKE2b-256 3d9d8b697558de046c9cdea9cb2646c62ad406cca1104c2a2e94ee0c2f5ee9d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f6470b029ecc1ac82af3923bd6ac9cf861a4b9ac8634fc6c4fb6afda379016ce
MD5 c267f252db89d5534800886c52aa3b25
BLAKE2b-256 22aa4fc9d36d98f49c499a9a577f28be1c6aa5559a5ea859e12457afc2974b53

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e1e67e59e3f7a4da8e811771295736c4573eb6fdcb33d14fa8194d98a4f41c36
MD5 d940f1debafaa88e3e7c983fe931eb88
BLAKE2b-256 4993514368e3e267c63b0e642fee261f5c8a437c4901f5cf0ae634ae7b6704d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 d693bec945fd80d10d12b1c1970b08bd8de958d1622a43beb954ad845043676e
MD5 0214d72ea6c42475ee83fc7ff90c0e79
BLAKE2b-256 51fdb6cc2e8bc212219e3484dc4ae1ec6512e1f04086346d20435ea1ff5fb8ad

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for plum_dispatch-1.5.9-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 e22873cba195739e6400bacfcb881ab2c2ac12251ea08fe66382fb592e5343c0
MD5 0949dd2fe277dd297764fb29a050c691
BLAKE2b-256 b2909ff454f547aa39fbc3d8b6c91babaeed8a59aebbc504096c05ae6731af69

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 1e0a70131634468bb80dd4a1df29dabefa047516ef702da7a75b635b5a1b50d1
MD5 abb8ab18141cb07d37fd1383ea423b46
BLAKE2b-256 fa825ad0986c74f0ccc2ba2fe6cebdbb0b2e03073e87d0172d4780e8341f77a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 5f71a1cef748528872291a62aa4bbfee673db045b3fc4fa32e1fe56a0583f515
MD5 760f58962a87c053b6c5cd2fddbd11b7
BLAKE2b-256 c5a16350c068dc66d038839cc25e69fd95366d8261cfd9285d9340a8339928e4

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.9-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.9-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 a9234ea2993b57efcc3a5353bc87ef0e881dc49730a0787f8851acb170a569f0
MD5 8aff4e906fab8269607f8ac8cafd101e
BLAKE2b-256 c3d9ba19cb606198896698b25fe4bc621d62725ee47591d5fa9bbe58d56e24a1

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.9-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.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 5c42cb1f2c0785914d5047f889c870d230a06332ad7442a5828327830a48d37c
MD5 09de91ca0de3947b1e257191b61b5cb0
BLAKE2b-256 16ed0c61a9abb280b3d64d194bbaf62d729176d0f84c2c0a7de5cdff4b88ee81

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 22a2e5fde2e86f64b752952985cd1b6d8620fde42ab654d57955b9fa50129218
MD5 468cc50f475adf689326e8035bdbb308
BLAKE2b-256 4a646fcee489e63bb6dcbb24528706ca0b198ccbd61b00193256878ab1016fa9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 1a74295e60835b61553dacc1d6405383579e58da4e4cc81718d9ac2f80692a03
MD5 95e499b141b35344cb0e239548c7073b
BLAKE2b-256 4378ee7a7d990ca688eae999eb59c15faf8a5c79df8b6939bb6066ee4874c2fc

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for plum_dispatch-1.5.9-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 00729f9cb229b45a1bbc76ad20e609c29cddb1a1319a745632feff4a6ff00b5d
MD5 d24a00b6eaf686caf37de38bd26ad4a6
BLAKE2b-256 7fb512b041ed12bf6720d97f8a93f3b86a88d3cbcd704c7fe54336473f8d1404

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp36-cp36m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 50d9c45de7ab954721bc47f5349258d4399a138a14f6a135a611ed6b1b5f9981
MD5 8aeedb51f43618515dc9d0d23ec3cbdd
BLAKE2b-256 0dabb4519dbee5d65685d76d624dd3ad2794f8d405e612da48ce712edc77a397

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp36-cp36m-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 705af1026d27a9815848769ab90368a2277e617bf74881299a39031cc052cb07
MD5 1733c7017232a7c50aa48af9730f6892
BLAKE2b-256 c818e41e0e0cc02660321d92029a50be6ad485c309e1527ab0d9be6c56301d6b

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.9-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.9-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 87f9c7d6a82f607b7b229556e02e1e10787cad8968ce91af19e7556152c10dfe
MD5 4301064ba9661b8320b0f13b043c22aa
BLAKE2b-256 eeb1e748948dbb070a561bbc4c07e52bd08dce68637b884a3eca566547691e27

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.5.9-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.9-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 81a829e7fcc1baa8d1f432f3b118b5a9cbeed221d5ae18f3cb95874fc6e462dd
MD5 94f9805e11c900d0a73c09463972f23b
BLAKE2b-256 3b8337235e6722789e7274f851483ca060266392f869acf3e815945454675d67

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.5.9-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7ac70d115ceecf8418736192f1663d5e8b244e86d8d70a5b3009a661d8036f03
MD5 9270c35c6b72da1da702cbe90d9e6799
BLAKE2b-256 ff25bfe494c66f81ec280d7aa4768489f7859b31f85c0eca2e2ad0900a6c1cd1

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