获取Jupyter Notebook中定义的对象的源代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取Jupyter Notebook中定义的对象的源代码相关的知识,希望对你有一定的参考价值。
通常,如果要获取对象的源,可以通过inspect
模块获取它:
import inspect
inspect.getsource(MyObject)
但是,在Jupyter笔记本中,这不起作用:
import inspect
class Foo:
def __init__(self, info):
self.info = info
a = Foo("hi")
inspect.getsource(a)
抛出错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-14-048b6f0c2e9b> in <module>()
7 a = Foo("hi")
8
----> 9 inspect.getsource(a)
/usr/lib/python3.6/inspect.py in getsource(object)
963 or code object. The source code is returned as a single string. An
964 OSError is raised if the source code cannot be retrieved."""
--> 965 lines, lnum = getsourcelines(object)
966 return ''.join(lines)
967
/usr/lib/python3.6/inspect.py in getsourcelines(object)
950 raised if the source code cannot be retrieved."""
951 object = unwrap(object)
--> 952 lines, lnum = findsource(object)
953
954 if ismodule(object):
/usr/lib/python3.6/inspect.py in findsource(object)
763 is raised if the source code cannot be retrieved."""
764
--> 765 file = getsourcefile(object)
766 if file:
767 # Invalidate cache if needed.
/usr/lib/python3.6/inspect.py in getsourcefile(object)
679 Return None if no way can be identified to get the source.
680 """
--> 681 filename = getfile(object)
682 all_bytecode_suffixes = importlib.machinery.DEBUG_BYTECODE_SUFFIXES[:]
683 all_bytecode_suffixes += importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES[:]
/usr/lib/python3.6/inspect.py in getfile(object)
661 return object.co_filename
662 raise TypeError('{!r} is not a module, class, method, '
--> 663 'function, traceback, frame, or code object'.format(object))
664
665 def getmodulename(path):
TypeError: <__main__.Foo object at 0x7fb9130ee518> is not a module, class, method, function, traceback, frame, or code object
如果我试图找到Foo
的来源(使用inspect.getsource(Foo)
),我得到:
TypeError: <module '__main__'> is a built-in class
如何获取Jupyter笔记本中定义的类的源代码?
答案
使用inspect.getsource(inspect.getfile)
我们可以得到一段处理这个问题的代码:
...
if isclass(object):
if hasattr(object, '__module__'):
object = sys.modules.get(object.__module__)
if hasattr(object, '__file__'):
return object.__file__
raise TypeError('{!r} is a built-in class'.format(object))
...
似乎在ipython或Jupyter笔记本中,定义的类/函数或__main__
模块没有与它们关联的__file__
属性,因此inspect
无法检索源文件。在这种情况下,您可以在单独的.py
文件中定义类,以便inspect
能够检索与其关联的文件。
以上是关于获取Jupyter Notebook中定义的对象的源代码的主要内容,如果未能解决你的问题,请参考以下文章
Jupyter (IPython) Notebook 单元格中有多个 Audio 对象
在 Jupyter Notebook 上获取 JsonDecodeError