FairShip
Loading...
Searching...
No Matches
method_logger.py
Go to the documentation of this file.
1# SPDX-License-Identifier: LGPL-3.0-or-later
2# SPDX-FileCopyrightText: Copyright CERN for the benefit of the SHiP Collaboration
3
4import sys
5from functools import wraps
6
7
9 """
10 This class wraps a instance of an arbitrary class, intercepts all its
11 method calls and logs them to a file (default: `sys.stdout`).
12
13 >>> import method_logger as ml
14 >>> from StringIO import StringIO
15 >>> class TestClass(object):
16 ... def __init__(self):
17 ... pass
18 ... def func(*args, **kwargs):
19 ... pass
20 ...
21 >>> cl = TestClass()
22 >>> sink = StringIO()
23 >>> lg = ml.MethodLogger(cl, sink=sink)
24 >>> lg.func(3, y=8, foo='bar')
25 >>> sink.getvalue()
26 "TestClass.func(3, y=8, foo='bar')\\n"
27 >>> sink.close()
28 """
29
30 def __init__(self, wrapped_instance, sink=sys.stdout) -> None:
31 self._class = wrapped_instance
32 self._sink = sink
33 self._prefix = type(wrapped_instance).__name__ + "."
34
35 def method_logger(self, met):
36 qualified_name = self._prefix + str(met.__name__)
37
38 @wraps(met)
39 def _logger(*args, **kwargs):
40 args_str = ", ".join(repr(arg) for arg in args)
41 kwargs_str = ", ".join(str(k) + "=" + repr(v) for (k, v) in kwargs.items())
42 all_args_str = args_str + (", " if len(kwargs_str) > 0 else "") + kwargs_str
43 print(f"{qualified_name}({all_args_str})", file=self._sink)
44 return met.__call__(*args, **kwargs)
45
46 return _logger
47
48 def __getattr__(self, attr):
49 return self.method_logger(getattr(self._class, attr))
def method_logger(self, met)
def __getattr__(self, attr)
None __init__(self, wrapped_instance, sink=sys.stdout)
void func()
Definition: group.cpp:13