Source code for line_profiler.autoprofile.line_profiler_utils

from __future__ import annotations

import inspect
from functools import cached_property, partial, partialmethod
from types import FunctionType, MethodType, ModuleType
from typing import TYPE_CHECKING, Any, Literal, overload

if TYPE_CHECKING:  # pragma: no cover
    from ..profiler_mixin import CLevelCallable, CythonCallable
    from ..scoping_policy import ScopingPolicy, ScopingPolicyDict


@overload
def add_imported_function_or_module(
    self,
    item: CLevelCallable | Any,
    *,
    scoping_policy: ScopingPolicy | str | ScopingPolicyDict | None = None,
    wrap: bool = False,
) -> Literal[0]: ...


@overload
def add_imported_function_or_module(
    self,
    item: (
        FunctionType
        | CythonCallable
        | type
        | partial
        | property
        | cached_property
        | MethodType
        | staticmethod
        | classmethod
        | partialmethod
        | ModuleType
    ),
    *,
    scoping_policy: ScopingPolicy | str | ScopingPolicyDict | None = None,
    wrap: bool = False,
) -> Literal[0, 1]: ...


[docs] def add_imported_function_or_module( self, item: object, *, scoping_policy: ScopingPolicy | str | ScopingPolicyDict | None = None, wrap: bool = False, ) -> Literal[0, 1]: """ Method to add an object to :py:class:`~.line_profiler.LineProfiler` to be profiled. This method is used to extend an instance of :py:class:`~.line_profiler.LineProfiler` so it can identify whether an object is a callable (wrapper), a class, or a module, and handle its profiling accordingly. Args: item (Union[Callable, Type, ModuleType]): Object to be profiled. scoping_policy (Union[ScopingPolicy, str, ScopingPolicyDict, None]): Whether (and how) to match the scope of members and decide on whether to add them: :py:class:`str` (incl. :py:class:`~.ScopingPolicy`): Strings are converted to :py:class:`~.ScopingPolicy` instances in a case-insensitive manner, and the same policy applies to all members. ``{'func': ..., 'class': ..., 'module': ...}`` Mapping specifying individual policies to be enacted for the corresponding member types. :py:const:`None` The default, equivalent to :py:data:`~line_profiler.line_profiler\ .DEFAULT_SCOPING_POLICIES`. See :py:class:`line_profiler.line_profiler.ScopingPolicy` and :py:meth:`~.ScopingPolicy.to_policies` for details. wrap (bool): Whether to replace the wrapped members with wrappers which automatically enable/disable the profiler when called. Returns: 1 if any function is added to the profiler, 0 otherwise. See also: :py:data:`~line_profiler.line_profiler\ .DEFAULT_SCOPING_POLICIES`, :py:meth:`.LineProfiler.add_callable()`, :py:meth:`.LineProfiler.add_module()`, :py:meth:`.LineProfiler.add_class()`, :py:class:`~.ScopingPolicy`, :py:meth:`ScopingPolicy.to_policies() \ <line_profiler.line_profiler.ScopingPolicy.to_policies>` """ if inspect.isclass(item): count = self.add_class(item, scoping_policy=scoping_policy, wrap=wrap) elif inspect.ismodule(item): count = self.add_module(item, scoping_policy=scoping_policy, wrap=wrap) else: try: count = self.add_callable(item) except TypeError: count = 0 if count: # Session-wide enabling means that we no longer have to wrap # individual callables to enable/disable the profiler when # they're called self.enable_by_count() return 1 if count else 0