Skip to content

trulens.core.utils.python

trulens.core.utils.python

Utilities related to core python functionalities.

Attributes

Thunk module-attribute

Thunk = Callable[[], T]

A function that takes no arguments.

NoneType module-attribute

NoneType = NoneType

Alias for types.NoneType .

In python < 3.10, it is defined as type(None) instead.

Classes

Future

Bases: Generic[A], Future

Alias for concurrent.futures.Future.

In python < 3.9, a sublcass of concurrent.futures.Future with Generic[A] is used instead.

Queue

Bases: Generic[A], Queue

Alias for queue.Queue .

In python < 3.9, a sublcass of queue.Queue with Generic[A] is used instead.

EmptyType

Bases: type

A type that cannot be instantiated or subclassed.

OpaqueWrapper

Bases: Generic[T]

Wrap an object preventing all access.

Any access except to unwrap will result in an exception with the given message.

PARAMETER DESCRIPTION
obj

The object to wrap.

TYPE: T

e

The exception to raise when an attribute is accessed.

TYPE: Exception

Functions
unwrap
unwrap() -> T

Get the wrapped object back.

SingletonInfo dataclass

Bases: Generic[T]

Information about a singleton instance.

Attributes
frame instance-attribute
frame: Any

The frame where the singleton was created.

This is used for showing "already created" warnings.

val instance-attribute
val: T = val

The singleton instance.

cls instance-attribute
cls: Type[T] = __class__

The class of the singleton instance.

name class-attribute instance-attribute
name: Optional[str] = name

The name of the singleton instance.

This is used for the SingletonPerName mechanism to have a separate singleton for each unique name (and class).

Functions
warning
warning()

Issue warning that this singleton already exists.

SingletonPerName

Class for creating singleton instances except there being one instance max, there is one max per different name argument. If name is never given, reverts to normal singleton behavior.

Functions
warning
warning()

Issue warning that this singleton already exists.

__new__
__new__(
    *args, name: Optional[str] = None, **kwargs
) -> SingletonPerName

Create the singleton instance if it doesn't already exist and return it.

delete_singleton_by_name staticmethod
delete_singleton_by_name(
    name: str, cls: Optional[Type[SingletonPerName]] = None
)

Delete the singleton instance with the given name.

This can be used for testing to create another singleton.

PARAMETER DESCRIPTION
name

The name of the singleton instance to delete.

TYPE: str

cls

The class of the singleton instance to delete. If not given, all instances with the given name are deleted.

TYPE: Optional[Type[SingletonPerName]] DEFAULT: None

delete_singleton
delete_singleton()

Delete the singleton instance. Can be used for testing to create another singleton.

Functions

getmembers_static

getmembers_static(obj, predicate=None)

Implementation of inspect.getmembers_static for python < 3.11.

class_name

class_name(obj: Union[Type, Any]) -> str

Get the class name of the given object or instance.

module_name

module_name(obj: Union[ModuleType, Type, Any]) -> str

Get the module name of the given module, class, or instance.

callable_name

callable_name(c: Callable)

Get the name of the given callable.

id_str

id_str(obj: Any) -> str

Get the id of the given object as a string in hex.

is_really_coroutinefunction

is_really_coroutinefunction(func) -> bool

Determine whether the given function is a coroutine function.

Warning

Inspect checkers for async functions do not work on openai clients, perhaps because they use @typing.overload. Because of that, we detect them by checking __wrapped__ attribute instead. Note that the inspect docs suggest they should be able to handle wrapped functions but perhaps they handle different type of wrapping? See https://docs.python.org/3/library/inspect.html#inspect.iscoroutinefunction . Another place they do not work is the decorator langchain uses to mark deprecated functions.

safe_signature

safe_signature(func_or_obj: Any)

Get the signature of the given function.

Sometimes signature fails for wrapped callables and in those cases we check for __call__ attribute and use that instead.

safe_hasattr

safe_hasattr(obj: Any, k: str) -> bool

Check if the given object has the given attribute.

Attempts to use static checks (see inspect.getattr_static) to avoid any side effects of attribute access (i.e. for properties).

safe_issubclass

safe_issubclass(cls: Type, parent: Type) -> bool

Check if the given class is a subclass of the given parent class.

code_line

code_line(func, show_source: bool = False) -> Optional[str]

Get a string representation of the location of the given function func.

locals_except

locals_except(*exceptions)

Get caller's locals except for the named exceptions.

for_all_methods

for_all_methods(
    decorator, _except: Optional[List[str]] = None
)

Applies decorator to all methods except classmethods, private methods and the ones specified with _except.

run_before

run_before(callback: Callable)

Create decorator to run the callback before the function.

superstack

superstack() -> Iterator[FrameType]

Get the current stack (not including this function) with frames reaching across Tasks and threads.

caller_module_name

caller_module_name(offset=0) -> str

Get the caller's (of this function) module name.

caller_module

caller_module(offset=0) -> ModuleType

Get the caller's (of this function) module.

caller_frame

caller_frame(offset=0) -> FrameType

Get the caller's (of this function) frame. See https://docs.python.org/3/reference/datamodel.html#frame-objects .

caller_frameinfo

caller_frameinfo(
    offset: int = 0, skip_module: Optional[str] = "trulens"
) -> Optional[FrameInfo]

Get the caller's (of this function) frameinfo. See https://docs.python.org/3/reference/datamodel.html#frame-objects .

PARAMETER DESCRIPTION
offset

The number of frames to skip. Default is 0.

TYPE: int DEFAULT: 0

skip_module

Skip frames from the given module. Default is "trulens".

TYPE: Optional[str] DEFAULT: 'trulens'

task_factory_with_stack

task_factory_with_stack(
    loop, coro, *args, **kwargs
) -> Sequence[FrameType]

A task factory that annotates created tasks with stacks of their parents.

All of such annotated stacks can be retrieved with stack_with_tasks as one merged stack.

tru_new_event_loop

tru_new_event_loop()

Replacement for new_event_loop that sets the task factory to make tasks that copy the stack from their creators.

get_task_stack

get_task_stack(task: Task) -> Sequence[FrameType]

Get the annotated stack (if available) on the given task.

merge_stacks

merge_stacks(
    s1: Sequence[FrameType], s2: Sequence[FrameType]
) -> Sequence[FrameType]

Assuming s1 is a subset of s2, combine the two stacks in presumed call order.

stack_with_tasks

stack_with_tasks() -> Sequence[FrameType]

Get the current stack (not including this function) with frames reaching across Tasks.

get_all_local_in_call_stack

get_all_local_in_call_stack(
    key: str,
    func: Callable[[Callable], bool],
    offset: Optional[int] = 1,
    skip: Optional[Any] = None,
) -> Iterator[Any]

Find locals in call stack by name.

PARAMETER DESCRIPTION
key

The name of the local variable to look for.

TYPE: str

func

Recognizer of the function to find in the call stack.

TYPE: Callable[[Callable], bool]

offset

The number of top frames to skip.

TYPE: Optional[int] DEFAULT: 1

skip

A frame to skip as well.

TYPE: Optional[Any] DEFAULT: None

Note

offset is unreliable for skipping the intended frame when operating with async tasks. In those cases, the skip argument is more reliable.

RETURNS DESCRIPTION
Iterator[Any]

An iterator over the values of the local variable named key in the stack at all of the frames executing a function which func recognizes (returns True on) starting from the top of the stack except offset top frames.

Returns None if func does not recognize any function in the stack.

RAISES DESCRIPTION
RuntimeError

Raised if a function is recognized but does not have key in its locals.

This method works across threads as long as they are started using TP.

get_first_local_in_call_stack

get_first_local_in_call_stack(
    key: str,
    func: Callable[[Callable], bool],
    offset: Optional[int] = 1,
    skip: Optional[Any] = None,
) -> Optional[Any]

Get the value of the local variable named key in the stack at the nearest frame executing a function which func recognizes (returns True on) starting from the top of the stack except offset top frames. If skip frame is provided, it is skipped as well. Returns None if func does not recognize the correct function. Raises RuntimeError if a function is recognized but does not have key in its locals.

This method works across threads as long as they are started using the TP class above.

NOTE: offset is unreliable for skipping the intended frame when operating with async tasks. In those cases, the skip argument is more reliable.

wrap_awaitable

wrap_awaitable(
    awaitable: Awaitable[T],
    on_await: Optional[Callable[[], Any]] = None,
    on_done: Optional[Callable[[T], Any]] = None,
) -> Awaitable[T]

Wrap an awaitable in another awaitable that will call callbacks before and after the given awaitable finishes.

Note that the resulting awaitable needs to be awaited for the callback to eventually trigger.

PARAMETER DESCRIPTION
awaitable

The awaitable to wrap.

TYPE: Awaitable[T]

on_await

The callback to call when the wrapper awaitable is awaited but before the wrapped awaitable is awaited.

TYPE: Optional[Callable[[], Any]] DEFAULT: None

on_done

The callback to call with the result of the wrapped awaitable once it is ready.

TYPE: Optional[Callable[[T], Any]] DEFAULT: None

wrap_generator

wrap_generator(
    gen: Generator[T, None, None],
    on_iter: Optional[Callable[[], Any]] = None,
    on_next: Optional[Callable[[T], Any]] = None,
    on_done: Optional[Callable[[], Any]] = None,
) -> Generator[T, None, None]

Wrap a generator in another generator that will call callbacks at various points in the generation process.

PARAMETER DESCRIPTION
gen

The generator to wrap.

TYPE: Generator[T, None, None]

on_iter

The callback to call when the wrapper generator is created but before a first iteration is produced.

TYPE: Optional[Callable[[], Any]] DEFAULT: None

on_next

The callback to call with the result of each iteration of the wrapped generator.

TYPE: Optional[Callable[[T], Any]] DEFAULT: None

on_done

The callback to call when the wrapped generator is exhausted.

TYPE: Optional[Callable[[], Any]] DEFAULT: None