获取Jupyter Notebook中定义的对象的源代码

问题描述 投票:2回答:1

通常,如果要获取对象的源,可以通过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笔记本中定义的类的源代码?

python python-3.x jupyter-notebook inspect
1个回答
1
投票

使用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能够检索与其关联的文件。

© www.soinside.com 2019 - 2024. All rights reserved.