|
| 1 | +# method_call_ctx_factory - tracing extention of pandas_flavor |
| 2 | + |
| 3 | +`method_call_ctx_factory` global var defined in [pandas_flavor/register.py](https://github.com/pyjanitor-devs/pandas_flavor/blob/c60bfd43adbcc304b3455055af73ed9fc9ac10d1/pandas_flavor/register.py#L8) is used |
| 4 | +to allow the methods registered via `pandas_flavors` to be traced. |
| 5 | + |
| 6 | +Default value of `method_call_ctx_factory` is None. |
| 7 | + |
| 8 | +Starting version 0.5.0 `pandas_flavor` implements the way to pass registered method name, signature and parameters to |
| 9 | +be handled by user-defined object when the call is made. To allow this the user of pandas_flavor must set |
| 10 | +`method_call_ctx_factory` to refer to function with signature `(method_name: str, method_args: list, method_kwargs: dict) -> tracing_ctx`. |
| 11 | +`tracing_ctx` should be class which implements methods with signatures as below: |
| 12 | + |
| 13 | +```python |
| 14 | +class tracing_ctx: |
| 15 | + def __enter__(self) -> None: pass |
| 16 | + def __exit__(self, type, value, traceback): -> None: pass |
| 17 | + def handle_start_method_call(self, method_name: str, |
| 18 | + method_signature: inspect.Signature, |
| 19 | + method_args: list, |
| 20 | + method_kwargs: dict) -> (list, dict): pass |
| 21 | + def handle_end_method_call(self, method_ret: object) -> None: pass |
| 22 | +``` |
| 23 | + |
| 24 | +During method call `pandas_flavor` will create object of class `tracing_ctx` then will use that object to enter *with* code block. |
| 25 | +`handle_start_method_call` and `handle_end_method_call` will be called before and after actual method call. The input arguments |
| 26 | +and return object of actual method call will be passed to corresponding `tracing_ctx` method. |
| 27 | + |
| 28 | +So `handle_start_method_call` and `handle_end_method_call` will have the chance to implement required tracing logic. |
| 29 | +Aslo, __exit__ method will be called if any exception would occur. This way it is possible to handle the situation of |
| 30 | +actual method ends by raising exception. |
| 31 | + |
| 32 | +The example of tracer class implementation and factory function registration is given in [tracing_ext-demo.py](/docs/tracing_ext-demo.py) |
0 commit comments