The Protocol class enables an interesting approach. (thx @SUTerliakov).
from typing import Protocol, runtime_checkable
# Define protocols which identify objects having specific attributes.
# We need to test for instances at runtime.
@runtime_checkable
class FooProtocol(Protocol):
foo: str
@runtime_checkable
class BarProtocol(Protocol):
bar: str
Define a function which 'dispatches` according to supported protocol
def explicit_dispatch(thing):
if isinstance(thing, FooProtocol):
print('implements FooProtocol')
elif isinstance(thing, BarProtocol):
print('implements BarProtocol')
else:
print('neither FooProtocol nor BarProtocol')
Create objects of 'unknown' type.
from dataclasses import dataclass
# dataclass enforces the setting of attributes
@dataclass
class FooObject:
foo: str
@dataclass
class BarObject:
bar: str
isFooObject = FooObject('foo')
isBarObject = BarObject('bar')
isObject = object()
Confirm function identifies instances of unknown classes.
explicit_dispatch(isFooObject)
explicit_dispatch(isBarObject)
explicit_dispatch(isObject)
prints out...
implements FooProtocol
implements BarProtocol
neither FooProtocol nor BarProtocol
Protocols
don't work with singledispatch
. You'll have to decide for yourself whether or not this is compatible with your coding style.