forked from goodboy/tractor
				
			Make `NamespacePath` kinda support methods..
Obviously we can't deterministic-ally call `.load_ref()` (since you'd have to point to an `id()` or something and presume a particular py-runtime + virt-mem space for it to exist?) but it at least helps with the `str` formatting for logging purposes (like `._cancel_rpc_tasks()`) when `repr`-ing ctxs and their specific "rpc signatures". Maybe in the future getting this working at least for singleton types per process (like `Actor` XD ) will be a thing we can support and make some sense of.. Boremotes/1757153874605917753/main
							parent
							
								
									1c217ef36f
								
							
						
					
					
						commit
						c421f7e722
					
				|  | @ -43,17 +43,24 @@ IPC-compat cross-mem-boundary object pointer. | |||
| # - https://github.com/msgpack/msgpack-python#packingunpacking-of-custom-data-type | ||||
| 
 | ||||
| from __future__ import annotations | ||||
| from inspect import isfunction | ||||
| from inspect import ( | ||||
|     isfunction, | ||||
|     ismethod, | ||||
| ) | ||||
| from pkgutil import resolve_name | ||||
| 
 | ||||
| 
 | ||||
| class NamespacePath(str): | ||||
|     ''' | ||||
|     A serializeable description of a (function) Python object | ||||
|     location described by the target's module path and namespace | ||||
|     key meant as a message-native "packet" to allows actors to | ||||
|     point-and-load objects by an absolute ``str`` (and thus | ||||
|     serializable) reference. | ||||
|     A serializeable `str`-subtype implementing a "namespace | ||||
|     pointer" to any Python object reference (like a function) | ||||
|     using the same format as the built-in `pkgutil.resolve_name()` | ||||
|     system. | ||||
| 
 | ||||
|     A value describes a target's module-path and namespace-key | ||||
|     separated by a ':' and thus can be easily used as | ||||
|     a IPC-message-native reference-type allowing memory isolated | ||||
|     actors to point-and-load objects via a minimal `str` value. | ||||
| 
 | ||||
|     ''' | ||||
|     _ref: object | type | None = None | ||||
|  | @ -81,13 +88,23 @@ class NamespacePath(str): | |||
| 
 | ||||
|         ''' | ||||
|         if ( | ||||
|             isinstance(ref, object) | ||||
|             and not isfunction(ref) | ||||
|             isfunction(ref) | ||||
|         ): | ||||
|             name: str = type(ref).__name__ | ||||
|         else: | ||||
|             name: str = getattr(ref, '__name__') | ||||
| 
 | ||||
|         elif ismethod(ref): | ||||
|             # build out the path manually i guess..? | ||||
|             # TODO: better way? | ||||
|             name: str = '.'.join([ | ||||
|                 type(ref.__self__).__name__, | ||||
|                 ref.__func__.__name__, | ||||
|             ]) | ||||
| 
 | ||||
|         else:  # object or other? | ||||
|             # isinstance(ref, object) | ||||
|             # and not isfunction(ref) | ||||
|             name: str = type(ref).__name__ | ||||
| 
 | ||||
|         # fully qualified namespace path, tuple. | ||||
|         fqnp: tuple[str, str] = ( | ||||
|             ref.__module__, | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue