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.7 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'

Support for IPython Autoreload

Plum does not work out of the box with IPython's autoreload extension, and if you reload a file where a class is defined, you will most likely break your dispatch table.

However, experimental support for IPython's autoreload is included into Plum, but it is not enabled by default, as it overrides some internal methods of IPython. To activate it, either set the environment variable PLUM_AUTORELOAD=1 before loading plum

export PLUM_AUTORELOAD=1

or manually call the autoreload.activate method in an interactive session.

import plum

plum.autoreload.activate()

If there are issues with autoreload, please open a bug report.

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.6.tar.gz (52.8 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.6-pp37-pypy37_pp73-win_amd64.whl (111.8 kB view details)

Uploaded PyPyWindows x86-64

plum_dispatch-1.6-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (138.4 kB view details)

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

plum_dispatch-1.6-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (140.2 kB view details)

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

plum_dispatch-1.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (124.7 kB view details)

Uploaded PyPymacOS 10.9+ x86-64

plum_dispatch-1.6-cp310-cp310-win_amd64.whl (128.3 kB view details)

Uploaded CPython 3.10Windows x86-64

plum_dispatch-1.6-cp310-cp310-win32.whl (118.1 kB view details)

Uploaded CPython 3.10Windows x86

plum_dispatch-1.6-cp310-cp310-musllinux_1_1_x86_64.whl (636.4 kB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ x86-64

plum_dispatch-1.6-cp310-cp310-musllinux_1_1_i686.whl (608.9 kB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ i686

plum_dispatch-1.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (562.8 kB view details)

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

plum_dispatch-1.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (541.3 kB view details)

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

plum_dispatch-1.6-cp310-cp310-macosx_11_0_arm64.whl (148.8 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

plum_dispatch-1.6-cp310-cp310-macosx_10_9_x86_64.whl (167.1 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

plum_dispatch-1.6-cp39-cp39-win_amd64.whl (129.9 kB view details)

Uploaded CPython 3.9Windows x86-64

plum_dispatch-1.6-cp39-cp39-win32.whl (119.0 kB view details)

Uploaded CPython 3.9Windows x86

plum_dispatch-1.6-cp39-cp39-musllinux_1_1_x86_64.whl (634.5 kB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ x86-64

plum_dispatch-1.6-cp39-cp39-musllinux_1_1_i686.whl (607.3 kB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ i686

plum_dispatch-1.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (572.8 kB view details)

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

plum_dispatch-1.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (548.0 kB view details)

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

plum_dispatch-1.6-cp39-cp39-macosx_11_0_arm64.whl (145.3 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

plum_dispatch-1.6-cp39-cp39-macosx_10_9_x86_64.whl (164.1 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

plum_dispatch-1.6-cp38-cp38-win_amd64.whl (130.0 kB view details)

Uploaded CPython 3.8Windows x86-64

plum_dispatch-1.6-cp38-cp38-win32.whl (119.2 kB view details)

Uploaded CPython 3.8Windows x86

plum_dispatch-1.6-cp38-cp38-musllinux_1_1_x86_64.whl (696.0 kB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ x86-64

plum_dispatch-1.6-cp38-cp38-musllinux_1_1_i686.whl (663.5 kB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ i686

plum_dispatch-1.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (624.4 kB view details)

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

plum_dispatch-1.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (595.7 kB view details)

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

plum_dispatch-1.6-cp38-cp38-macosx_11_0_arm64.whl (145.6 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

plum_dispatch-1.6-cp38-cp38-macosx_10_9_x86_64.whl (162.7 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

plum_dispatch-1.6-cp37-cp37m-win_amd64.whl (126.8 kB view details)

Uploaded CPython 3.7mWindows x86-64

plum_dispatch-1.6-cp37-cp37m-win32.whl (116.5 kB view details)

Uploaded CPython 3.7mWindows x86

plum_dispatch-1.6-cp37-cp37m-musllinux_1_1_x86_64.whl (572.3 kB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ x86-64

plum_dispatch-1.6-cp37-cp37m-musllinux_1_1_i686.whl (541.6 kB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ i686

plum_dispatch-1.6-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (508.2 kB view details)

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

plum_dispatch-1.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (481.8 kB view details)

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

plum_dispatch-1.6-cp37-cp37m-macosx_10_9_x86_64.whl (160.4 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: plum-dispatch-1.6.tar.gz
  • Upload date:
  • Size: 52.8 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.6.tar.gz
Algorithm Hash digest
SHA256 eaf186401ebadc4ee6761e57e968d6e71ad3419706bfda2e04fa48581bedaa19
MD5 43e9956cce401eab284646be8a852020
BLAKE2b-256 0505b022cc12f14c48e940a503674285524d23595be5a441ed6551e3d461ba1c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-pp37-pypy37_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 fefc535255346e1c228b540c5c55276564071737b097627f878f5a4d22e0d951
MD5 64d24f90fbe1b0f8da67f62d8a169f7d
BLAKE2b-256 6669720a747c6b0fa9ffeaaacb6fb0853788b47d179e97054a62994755ba9033

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.6-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.6-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 872706516131e6405885b13db9bf9ed689409b6a978f00edde483d5f8e9ffd96
MD5 80d924f1d0ffd69242fce1b20d07bbd7
BLAKE2b-256 52975642bdc1b6f7ab5d888256d25240d9e9f9a019627e7b4a54542db467aa86

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.6-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.6-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 2b19f490fa3aedfcec2688b3fbcf4d5cf462c85afd964a6ab69c1e2ca1c0f6bf
MD5 8e820b6e58f9b355cb5205ea3654af3d
BLAKE2b-256 7b99759cbcfd2f446169f2bf1866a8df314f0b9238948898897a16336e2e0110

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 11235d2c4839e9050d46f4db6078605af56aedc3e16b22a50e61f0f02d01efc6
MD5 9a906c2b566c284403bce6ef69d487d0
BLAKE2b-256 b9c02e0f7e106c070ab39a23363b233962cdc1969f7a32245f62b6ca9abe77d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 409468ee9f79f23543d47fb72b0b0f0863f9eded9dd7433f9f59a501aa08052b
MD5 9d6486c9128690ecf1bc4e51f45e9f87
BLAKE2b-256 e6a22e204c892a1aebf004ded1ca762c27e351f911516d81a675eeab115195b1

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for plum_dispatch-1.6-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 075121bd418d065cf078e00d236e9201dcb22a285766db4a6de2eda1fb03a08a
MD5 1da29800788db5eec799f54af97aba28
BLAKE2b-256 4179831f8eb53593484cae3e220670fc20ff858456c016d50e24992dd3a1be53

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 c9b1384952b7ac6ada44e5e2c5364c17f40f620a89a760bc1c8aacf428bbb62b
MD5 eec8d492f50b6ce37a87ea9e0d5d3f11
BLAKE2b-256 9bde93cd621045de3d8e4b0c9af88a4b7ac622de67f5218b158c78432bfe5276

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp310-cp310-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 b30a86b0ec214f409bcc271dd55db02aa3cb87d423c04285037afe4bdd630786
MD5 c43b02d845c59f17eac1d976ead78c0c
BLAKE2b-256 3b47405434db564f6c3b744e5fab300e11fddbd2c58c2dbe9822307af15681ed

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.6-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.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 6c0e968cf41e8110c8da0d02aa6b83736dd518372dd0a097f5a5c924f23c742d
MD5 06f15550ca63007824db2b80b0fc14f6
BLAKE2b-256 da15a8235297d24294dca8f6302fefbcb54a4c4a50dc71bed809f145360ea0ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 a993db7fe1e37dee34aa5377ee60f9eafe60ebe0b9fb8085c62b47bc115f511f
MD5 7d7116071fd2bf785e719b276e90ef0a
BLAKE2b-256 db1bd76a1d40e5e547faf4007cdc0de470f0a26e13c0650e9bd797307d7687ff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 263842eead4fd393a852d7b013b11224be9d9091252374a664408054fd222dd1
MD5 050bea9343aa71caacffd9416e4a3b62
BLAKE2b-256 3c5ce5b50f4d5d9ce426825825a266ebee2d4ec430b0cdc8903ab8c5a1576890

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b5436e7e6f81582af3d589e151afbaf0881298ddc3dde0492f94f0ce74176c72
MD5 ed251870113ebc63d4174dc6c8b98616
BLAKE2b-256 aed082a377773226e2d79a0638fb6c27886eaecab0580e5faa85b8eb692894e8

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for plum_dispatch-1.6-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 7704f493f3163b43fbee13746319c2e32f2c8bec3f3a4d69c8e90ead0ab94a3c
MD5 0e588f6363bc0f729ee63c856b4b7ecc
BLAKE2b-256 572e73acaccba2631bf4e8e8e449b273d2798cdae8c9f1a2171b0a9aa18fc63d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: plum_dispatch-1.6-cp39-cp39-win32.whl
  • Upload date:
  • Size: 119.0 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.6-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 672758e0bbd5658f11e04d78e7a1c61096ba33d6e8a8e066c776877b13ce5eab
MD5 5b1085cc5487cb5542fdf18984214660
BLAKE2b-256 1ae8ffff0ea60b687c82de8380715e5f82c9bb401c6a0e0cd3c0047fe5ccb653

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 143a9381f716e571c442da74cbb543d9112641a15a9f9b0cb09218945da770ca
MD5 8919ba3069709db7fbe5b27c4796e080
BLAKE2b-256 0d918c298a0cf9ba884bd6a728dec705111e7cb37f721e5e3f72b29e17a003cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp39-cp39-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 9ba066fbf30f04b5e6137be2326461521a0248c04479e81537d7e1e554913fc0
MD5 452cae82e71953a82470132fea2c0668
BLAKE2b-256 a3547ef331c41220bfac06f9437385ab8f74a192a1d05a15a3e32db40c3c30d0

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.6-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.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 1d2f90c9b82e74151fadd482952d9f19bdd818643b1585ed0b7601e54ecac5ab
MD5 e69d5d3635a3f83fbe2f42d0ce2cb9ff
BLAKE2b-256 4115150cc0a66917541b5accf5d1bf2d97abe4cee2fd1f114798ee7a7ea448ca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 c730f751125a3889e9c389ab9320d34d16831ff332aa66cf7d636d178d12ee46
MD5 792ead2c33ef68c09b1d40293a2b586d
BLAKE2b-256 876bffb59bb44e2f9835a4695b107c590378e1cb27f99e13c007d56a49024ac9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 88d5fcd66fe0c1c549fcca093a8e24407660905688b9af48ee4cd605859e4d36
MD5 0fb5b32c621c07f8d304803f5a00e532
BLAKE2b-256 a96da05e84885600f2be250ee7f7d55ce0f3fb56431fdda60f90415609d46645

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 846beac8deb4cfaa7ec79552e7a12c532d1d57b78aa77a65d85a488fa7575b36
MD5 92749bf82c8de68f54d67d1d6621fd07
BLAKE2b-256 136876331e8c19e3f24f8c5250773fd661af560a6ab490558f4fd8e0f92140f8

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for plum_dispatch-1.6-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 9b17f188e28339f970e743c43a9a32d5c796d5530d4be4d3170acf10264fbed0
MD5 7e9f18e649c7c19c5fdc5f307a28f798
BLAKE2b-256 8d03374b6c604c7c1ba2497f0101ceeeb41a750323d28a227986b8d16cc15554

See more details on using hashes here.

File details

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

File metadata

  • Download URL: plum_dispatch-1.6-cp38-cp38-win32.whl
  • Upload date:
  • Size: 119.2 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.6-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 a2a0d6785736fab810210d221b847f4ec6a23c26dd1d0085f1116691d0cf24c1
MD5 a9a8b0a82613101652d9a932c505567d
BLAKE2b-256 c5f7714bbc5ea78f029400878a3d455dadcb270b808c93c55dcf675f1838def3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 1f48ce8594414cf5f3745747e6b36a61713af1b45c44a1de8365f4c58707584f
MD5 f531ba47e055ffc82190f3d2d6f10afc
BLAKE2b-256 0a82568e448e9d80639f4af778a33983abe66709aa97fa917e37f4eaad48fc56

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp38-cp38-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 f1f354b678f74cb70ff857a674ebb1115e7e5e05741acb01415e211964c95ad1
MD5 6b9c2d42923fef6c063369b0e31a70d2
BLAKE2b-256 ba7da8cb89c9226cf65d8638511b19234d38e95330aafc46c30cffd0e33fdc55

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.6-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.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 2076ce617f23296d92e5e50d5c2fde8bf20d4a18ed368a87bfe8646cfe8896cc
MD5 d10a2274c11fc676f18b9c70a4d1cd7f
BLAKE2b-256 044230900e566beeeb0c5d8f850dcf00907367363738b2a71c44902de26ce992

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 0d2b391f363ee45f9fc4b089add1050e6bc837eea6fe81b9b4dc5ef16e526d7b
MD5 18fb8efc6de99ea26232eb647e6b43a5
BLAKE2b-256 86e0298ee87ab676bd8026b91c293b0f77ff014497497bf1322625c71148f411

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 443ad592cff96dd7f568cacdfd880c33621164292cfe1832bdbae4bed2ed2288
MD5 0580ba060ff7477bd889c8de2450080d
BLAKE2b-256 4eb9a4076f959109ad2f8204a9569b5429df4312aa19483f0cdfa09d6d90f61f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e937b595e55f4a84b20c291690fb9b70888aa8212d6f2d9b89c5adf67177fcbc
MD5 fe3aa9c313ad21a60898bc9316267929
BLAKE2b-256 016f45144b4c9adafefbf90610c1e75e25876b48c995436fb96eb747f9e5cbf1

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for plum_dispatch-1.6-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 1de9151bc7ac394a82aec7f2ef25a2190144400479e8f26782eb9e3bbb064adb
MD5 f0ed92bad097a11c05cc12668fe31635
BLAKE2b-256 050c180221d0da2ef6d8e4b7f419e32198bce4daffce22f2bc4098ded727df5f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: plum_dispatch-1.6-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 116.5 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.6-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 85bd98a40debd1906ac1f9f13f90d354ae6e78a57117ac8cd72cbcc06a4f00b3
MD5 c90be2f65e1aa4a63e33ecbbf718147f
BLAKE2b-256 e1d490fe971ba88606021a5da902e0ca5d746ef257a453684da8d929de4fd60c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 2884c48d8602118a44363e7dec67c54f56e1ae57d54f5225ddbce9d3eee77d02
MD5 33aba1dcd0cd65e509559f66567eb0b1
BLAKE2b-256 b8c1c0046d869201d33cb0db8532c5b715870b68f2f17bb9bfcc7660d54a5fee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 07171398ce613388bfca48ea7ac3b4a310ab53aad9203fc251056087e421e676
MD5 aa273e43d066f775b5f308f688ca9f3a
BLAKE2b-256 a6d0c080ec6a77860e3641e59df84675b96a96d8bd16df4dd47e4114fffeb01e

See more details on using hashes here.

File details

Details for the file plum_dispatch-1.6-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.6-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 e28e0bdeffb07fbb89e0afac1af3864a92dd1d5b16fac5c6e8b137880310f9f7
MD5 30ca05e9515406e0fc3863560ff4b9ff
BLAKE2b-256 f0028603a0fb388a31b545717393f386bd537eb7371dedfa8dbe3017775669f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 22d8a24dd5a075b487f3f1b49224cb84afefb612d18ab992c411f086a62fcbb4
MD5 01d2e3c74b0399245dd5385d94380d8b
BLAKE2b-256 5388af72f8ee364d421221c43b35f7d464e5de708d5585ee0ecebbdf9b56313b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for plum_dispatch-1.6-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b8b2187a753eb07d39122d613329f62258ffa81e77323942a990fa5648d30190
MD5 70d6b1e6817e9c82aea54ef6c19d3430
BLAKE2b-256 8a81305ec6afe2eacb8a3585cb9ee1fc2136901f00e922ea9a4cc4da9060068f

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