给定一个内联定义的函数,我如何getsource
提供输出?- 这是一个测试,这是我正在尝试的那种事情:
from importlib.util import module_from_spec, spec_from_loader
_locals = module_from_spec(
spec_from_loader("helper", loader=None, origin="str") # loader=MemoryInspectLoader
)
exec(
'def f(): return "foo"',
_locals.__dict__,
)
f = getattr(_locals, "f")
setattr(f, "__loader__", MemoryInspectLoader)
通过我的尝试,因为它看起来像一个linecache
问题:
from importlib.abc import Loader
class MemoryInspectLoader(Loader):
def get_code(self): raise NotImplementedError()
但是永远不会引发错误。从getsource(f)
,我得到:
In [2]: import inspect
...: inspect.getsource(f)
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
<ipython-input-3-1348c7a45f75> in <module>
----> 1 inspect.getsource(f)
/usr/lib/python3.8/inspect.py in getsource(object)
983 or code object. The source code is returned as a single string. An
984 OSError is raised if the source code cannot be retrieved."""
--> 985 lines, lnum = getsourcelines(object)
986 return ''.join(lines)
987
/usr/lib/python3.8/inspect.py in getsourcelines(object)
965 raised if the source code cannot be retrieved."""
966 object = unwrap(object)
--> 967 lines, lnum = findsource(object)
968
969 if istraceback(object):
/usr/lib/python3.8/inspect.py in findsource(object)
796 lines = linecache.getlines(file)
797 if not lines:
--> 798 raise OSError('could not get source code')
799
800 if ismodule(object):
OSError: could not get source code
如何getsource
在 Python 3.6+ 中使用内联定义的函数?