Skip to main content

A library for intercepting and processing Python method calls.

Project description

PyInterceptor

A library for intercepting and processing Python method calls.

Introduction

Sometimes it might be interesting to get detailed knowledge about which methods of an object have been called with which args, kwargs, at which time, etc. but without changing the underlying code. This is especially useful for:

  • Debugging
  • Logging
  • Creating call statistics, etc.

PyInterceptor enables exactly this - it installs a handler function into a target object that intercepts specified methods and stores (meta-) data about the calls in CallInfo objects. These objects are then handed over to a user-defined interceptor callable.

call_sequence_detailed.png

PyInterceptor distinguishes between 2 modi:

  • blocking mode: In this mode the handler does not execute the actual method and returns the return value from the interceptor. This mode is very useful when creating mocks or stubs.
  • non-blocking mode: In this mode the handler executed the actual method and forwards its return value to the interceptor callable. Then it continues like in the blocking mode.

Installation

To install PyInterceptor from pypi using pip type: pip install py-interceptor

To install PyInterceptor from source, do the following steps:

  1. Create an environment, e.g. with venv
    • python -m venv env
    • env\Scripts\activate (windows)
    • source env/bin/activate (linux)
  2. Install the package from source
    • cd py-interceptor
    • pip install -e . (without dev dependencies)
    • pip install -e .[dev] (with dev dependencies)
  3. Execute unit tests (requires dev dependencies)
    • pytest

Examples

The following example demonstrates how easy it is to intercept an object's method. Here we want to print the name of the executed API method together with the args and the return value:

from interceptor import CallInfo, intercept


class API:
    def add(self, a, b):
        return a + b

def interceptor(info: CallInfo):
    print(f"Executed {info.name} with args {info.args} -> returned {info.ret_value}")

api = API()
intercept("add", api, interceptor, blocking=False)
api.add(1, 2)

The output should be: Executed add with args (1, 2) -> returned 3

More example can be found in the examples folder.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py_interceptor-0.1.0.tar.gz (5.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

py_interceptor-0.1.0-py3-none-any.whl (4.8 kB view details)

Uploaded Python 3

File details

Details for the file py_interceptor-0.1.0.tar.gz.

File metadata

  • Download URL: py_interceptor-0.1.0.tar.gz
  • Upload date:
  • Size: 5.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.9.19

File hashes

Hashes for py_interceptor-0.1.0.tar.gz
Algorithm Hash digest
SHA256 11c0b517290aaf72269140f7a0a49b7393d312b24de6cc0c2a7fffd898b1c7bf
MD5 4c6bcc75ee8071baf01777811710bcda
BLAKE2b-256 9979e045ba208edf97b39a275f4049b7238da659b3e927d6316ea1e6e3685952

See more details on using hashes here.

File details

Details for the file py_interceptor-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: py_interceptor-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 4.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.9.19

File hashes

Hashes for py_interceptor-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d267da449810021849a7769e54930ee0486daf1bfc9d9bf4e873ef6d8d2e7e55
MD5 8bcf6d3ddcaa34f1a2ad5089207618db
BLAKE2b-256 379f802cfc609efe94a8e6e3fd98bd78629bb554f4b1a72055dbfc06d38516e6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page