【问题标题】:How do I get the source for a Python class I declared programmatically?如何获取我以编程方式声明的 Python 类的源代码?
【发布时间】:2023-04-02 02:20:01
【问题描述】:

我正在尝试使用inspect.getsource() 来获取这样定义的类的源代码:

import inspect

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

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

Cat.meow = meow_local

print(inspect.getsource(Cat))

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

OSError: 找不到类定义

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

或者有其他方法可以获得相同的结果吗?

【问题讨论】:

  • 不确定,但我认为要输入的第二个参数应该是 (object,)
  • 确保您也将文件保存为 python 文件。不能解决问题,但有帮助。
  • @stefan type() with 3 params 返回一个新类型并期望 1. 名称 2. 基类元组 3. 属性字典

标签: python python-3.x reflection metaprogramming metaclass


【解决方案1】:

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

inspect.getsource 通过找出实际的.py 文件来工作 在磁盘中定义并获取文件行,就像它们在磁盘上一样,带有 cmets、空格等。

即使您将程序定义的类所需的所有元信息都填充到一定程度,您将获得 __file__ 值和代码对象中的行信息,getsource 将尝试读取该文件并获得里面的文字。

您没有提及您的实际问题 - 如果您想为您创建的类使用 Python 代码,您可以反转这个东西,并内省您生成的类以编写正确的@987654326 @ 文件的作用与最初的程序调用相同。

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

Detect if class was defined declarative or functional - possible?

【讨论】:

  • 我有大量描述类名和属性的文本文件。我想生成类定义样板、setter/getter 并将它们放入文件中。从那里可以编辑它们。我知道我可以使用像jinjia2 和caveman 这样的模板。我只是想看看能不能找到更聪明的方法;也许不是。
  • 所以你真的想为你放在文本文件中的类规范呈现可读的 Python。我认为 jinja2 或其他模板,结合内省,如果你想创建实际的类对象,可以很好地工作。
猜你喜欢
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2020-12-07
  • 2012-10-01
  • 1970-01-01
相关资源
最近更新 更多