Make `NamespacePath` work on object refs
Detect if the input ref is a non-func (like an `object` instance) in which case grab its type name using `type()`. Wrap all the name-getting into a new `_mk_fqpn()` static meth: gets the "fully qualified path name" and returns path and name in tuple; port other methds to use it. Refine and update the docs B)asyncio_debugger_support
parent
b36b3d522f
commit
bee2c36072
|
@ -43,38 +43,62 @@ Built-in messaging patterns, types, APIs and helpers.
|
||||||
# - https://github.com/msgpack/msgpack-python#packingunpacking-of-custom-data-type
|
# - https://github.com/msgpack/msgpack-python#packingunpacking-of-custom-data-type
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
from inspect import isfunction
|
||||||
from pkgutil import resolve_name
|
from pkgutil import resolve_name
|
||||||
|
|
||||||
|
|
||||||
class NamespacePath(str):
|
class NamespacePath(str):
|
||||||
'''
|
'''
|
||||||
A serializeable description of a (function) Python object location
|
A serializeable description of a (function) Python object
|
||||||
described by the target's module path and namespace key meant as
|
location described by the target's module path and namespace
|
||||||
a message-native "packet" to allows actors to point-and-load objects
|
key meant as a message-native "packet" to allows actors to
|
||||||
by absolute reference.
|
point-and-load objects by an absolute ``str`` (and thus
|
||||||
|
serializable) reference.
|
||||||
|
|
||||||
'''
|
'''
|
||||||
_ref: object = None
|
_ref: object | type | None = None
|
||||||
|
|
||||||
def load_ref(self) -> object:
|
def load_ref(self) -> object | type:
|
||||||
if self._ref is None:
|
if self._ref is None:
|
||||||
self._ref = resolve_name(self)
|
self._ref = resolve_name(self)
|
||||||
return self._ref
|
return self._ref
|
||||||
|
|
||||||
def to_tuple(
|
@staticmethod
|
||||||
self,
|
def _mk_fqnp(ref: type | object) -> tuple[str, str]:
|
||||||
|
'''
|
||||||
|
Generate a minial ``str`` pair which describes a python
|
||||||
|
object's namespace path and object/type name.
|
||||||
|
|
||||||
) -> tuple[str, str]:
|
In more precise terms something like:
|
||||||
ref = self.load_ref()
|
- 'py.namespace.path:object_name',
|
||||||
return ref.__module__, getattr(ref, '__name__', '')
|
- eg.'tractor.msg:NamespacePath' will be the ``str`` form
|
||||||
|
of THIS type XD
|
||||||
|
|
||||||
|
'''
|
||||||
|
if (
|
||||||
|
isinstance(ref, object)
|
||||||
|
and not isfunction(ref)
|
||||||
|
):
|
||||||
|
name: str = type(ref).__name__
|
||||||
|
else:
|
||||||
|
name: str = getattr(ref, '__name__')
|
||||||
|
|
||||||
|
# fully qualified namespace path, tuple.
|
||||||
|
fqnp: tuple[str, str] = (
|
||||||
|
ref.__module__,
|
||||||
|
name,
|
||||||
|
)
|
||||||
|
return fqnp
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_ref(
|
def from_ref(
|
||||||
cls,
|
cls,
|
||||||
ref,
|
ref: type | object,
|
||||||
|
|
||||||
) -> NamespacePath:
|
) -> NamespacePath:
|
||||||
return cls(':'.join(
|
|
||||||
(ref.__module__,
|
fqnp: tuple[str, str] = cls._mk_fqnp(ref)
|
||||||
getattr(ref, '__name__', ''))
|
return cls(':'.join(fqnp))
|
||||||
))
|
|
||||||
|
def to_tuple(self) -> tuple[str, str]:
|
||||||
|
return self._mk_fqnp(self.load_ref())
|
||||||
|
|
Loading…
Reference in New Issue