A method, possibly with a default/reference implementation, that can have other implementations provided by different backends.
If a multimethod does not have an implementation, a
BackendNotImplementedError is raised.
A backend is an entity that can provide implementations for different functions. It can also (optionally) receive some options from the user about how to process the implementations. A backend can be set permanently or temporarily.
A domain defines the hierarchical grouping of multimethods. The domain string is, by convention, the name of the module that provides the multimethods.
Sub-domains are denoted with a separating
.. For example, a multimethod in
"numpy.fft" is also considered to be in the domain
"numpy". When calling
a multimethod, the backends for the most specific sub-domain are always tried first,
followed by the next domain up the hierarchy.
Dispatching is the process of forwarding a function call to an implementation in a backend.
A backend might have different object types compared to the reference implementation, or it might require some other conversions of objects. Conversion is the process of converting any given object into a library’s native form.
Coercions are conversions that may take a long time, usually those
involving copying or moving of data. As a rule of thumb, conversions
O(log n) (where
n is the size of the object in
memory) should be made into coercions.
Marking is the process of telling the backend what convertor to use for a given argument.