summaryrefslogtreecommitdiff
path: root/lab
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2018-09-24 06:15:37 -0400
committerNed Batchelder <ned@nedbatchelder.com>2018-09-24 06:20:07 -0400
commit7b0badf176832c11ec6a08c124985638c6a13407 (patch)
tree18394e119c152f0fec3791e4f36a07487c80065a /lab
parent9a0f9e19ba43887d53fdc53f015f00148e9ba2b9 (diff)
downloadpython-coveragepy-git-7b0badf176832c11ec6a08c124985638c6a13407.tar.gz
This could come in handy eventually
Diffstat (limited to 'lab')
-rw-r--r--lab/find_class.py40
1 files changed, 40 insertions, 0 deletions
diff --git a/lab/find_class.py b/lab/find_class.py
new file mode 100644
index 00000000..d8dac0b5
--- /dev/null
+++ b/lab/find_class.py
@@ -0,0 +1,40 @@
+class Parent(object):
+ def meth(self):
+ print("METH")
+
+class Child(Parent):
+ pass
+
+def trace(frame, event, args):
+ # Thanks to Aleksi Torhamo for code and idea.
+ co = frame.f_code
+ fname = co.co_name
+ if not co.co_varnames:
+ return
+ locs = frame.f_locals
+ first_arg = co.co_varnames[0]
+ if co.co_argcount:
+ self = locs[first_arg]
+ elif co.co_flags & 0x04: # *args syntax
+ self = locs[first_arg][0]
+ else:
+ return
+
+ func = getattr(self, fname).__func__
+ if hasattr(func, '__qualname__'):
+ qname = func.__qualname__
+ else:
+ for cls in self.__class__.__mro__:
+ f = cls.__dict__.get(fname, None)
+ if f is None:
+ continue
+ if f is func:
+ qname = cls.__name__ + "." + fname
+ break
+ print("{}: {}.{} {}".format(event, self, fname, qname))
+ return trace
+
+import sys
+sys.settrace(trace)
+
+Child().meth()