首页 > 解决方案 > 如何获取我以编程方式声明的 Python 类的源代码?

问题描述

我试图用来inspect.getsource()获取这样定义的类的来源:

import inspect

Cat = type('Cat', (), {})

def meow_local(self):
  print("meow")

Cat.meow = meow_local

print(inspect.getsource(Cat))

我从检查中得到的错误是:

OSError:找不到类定义

可以理解,inspect 不知道找到 Cat 类的正确位置。我应该告诉检查到哪里看?

还是有其他方法可以获得相同的结果?

标签: pythonpython-3.xreflectionmetaprogrammingmetaclass

解决方案


你没有。你不能,因为它没有源代码。

inspect.getsource通过找出.py定义了某些内容的实际文件,并获取文件行,就像它们在磁盘上一样,带有注释、空格等。

即使您将程序定义的类上所需的所有元信息都填充到一定程度,您将获得一个 __file__值,并且代码对象中的行信息getsource也会尝试读取该文件并在其中获取文本。

您没有提及您的实际问题 - 如果您想为您创建的类使用 Python 代码,您可以反转这个东西,并内省您生成的类以编写一个正确的.py文件,该文件与第一次的程序调用相同地方。

另一方面,如果您想要包含type调用的行的源代码,这是可行的 - 但您必须自定义类的创建,以便在用于创建的代码对象上拥有文件和行号信息班级。调用type不使用代码对象开始 - 但有一些方法可以做到这一点,虽然很复杂。不久前,我回答了一个问题,即是否有可能使以编程方式声明的类与普通的声明类无法区分-我深入研究了它-该答案将显示在正常方式,其中一些你必须填写 - 或者更糟 -伪造来创建一个程序类,创建调用可以通过以下方式确定getsource

检测类是否定义为声明性或功能性 - 可能吗?


推荐阅读