MCPcopy Create free account
hub / github.com/RT-Thread/env-windows / file_module_function_of

Method file_module_function_of

tools/python-3.11.9-amd64/Lib/trace.py:467–506  ·  view source on GitHub ↗
(self, frame)

Source from the content-addressed store, hash-verified

465 return result
466
467 def file_module_function_of(self, frame):
468 code = frame.f_code
469 filename = code.co_filename
470 if filename:
471 modulename = _modname(filename)
472 else:
473 modulename = None
474
475 funcname = code.co_name
476 clsname = None
477 if code in self._caller_cache:
478 if self._caller_cache[code] is not None:
479 clsname = self._caller_cache[code]
480 else:
481 self._caller_cache[code] = None
482 ## use of gc.get_referrers() was suggested by Michael Hudson
483 # all functions which refer to this code object
484 funcs = [f for f in gc.get_referrers(code)
485 if inspect.isfunction(f)]
486 # require len(func) == 1 to avoid ambiguity caused by calls to
487 # new.function(): "In the face of ambiguity, refuse the
488 # temptation to guess."
489 if len(funcs) == 1:
490 dicts = [d for d in gc.get_referrers(funcs[0])
491 if isinstance(d, dict)]
492 if len(dicts) == 1:
493 classes = [c for c in gc.get_referrers(dicts[0])
494 if hasattr(c, "__bases__")]
495 if len(classes) == 1:
496 # ditto for new.classobj()
497 clsname = classes[0].__name__
498 # cache the result - assumption is that new.* is
499 # not called later to disturb this relationship
500 # _caller_cache could be flushed if functions in
501 # the new module get called.
502 self._caller_cache[code] = clsname
503 if clsname is not None:
504 funcname = "%s.%s" % (clsname, funcname)
505
506 return filename, modulename, funcname
507
508 def globaltrace_trackcallers(self, frame, why, arg):
509 """Handler for call events.

Callers 2

Calls 1

_modnameFunction · 0.85

Tested by

no test coverage detected