python - 如何获取我以编程方式声明的 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 类的正确位置。我应该告诉检查到哪里看?
还是有其他方法可以获得相同的结果?
解决方案
你没有。你不能,因为它没有源代码。
inspect.getsource
通过找出.py
定义了某些内容的实际文件,并获取文件行,就像它们在磁盘上一样,带有注释、空格等。
即使您将程序定义的类上所需的所有元信息都填充到一定程度,您将获得一个 __file__
值,并且代码对象中的行信息getsource
也会尝试读取该文件并在其中获取文本。
您没有提及您的实际问题 - 如果您想为您创建的类使用 Python 代码,您可以反转这个东西,并内省您生成的类以编写一个正确的.py
文件,该文件与第一次的程序调用相同地方。
另一方面,如果您想要包含type
调用的行的源代码,这是可行的 - 但您必须自定义类的创建,以便在用于创建的代码对象上拥有文件和行号信息班级。调用type
不使用代码对象开始 - 但有一些方法可以做到这一点,虽然很复杂。不久前,我回答了一个问题,即是否有可能使以编程方式声明的类与普通的声明类无法区分-我深入研究了它-该答案将显示在正常方式,其中一些你必须填写 - 或者更糟 -伪造来创建一个程序类,创建调用可以通过以下方式确定getsource
:
推荐阅读
- amazon-web-services - AWS Data Pipeline 无法验证 S3 访问 [权限警告]
- reactjs - react hooks 引用值如何传递给依赖数组?
- reactjs - react js中登录或注册后如何推送用户到首页?
- objective-c - 如何修复''预期';' 在顶级声明符之后”和“未知类型名称‘类’?
- php - 使用来自客户端的新信息登录(提交表)后将用户添加到新表中
- ansible - 如何在 ansible-console 中注册变量?
- java - java.sql.SQLException:连接 org.postgresql.jdbc.PgConnection 已关闭
- angular - RxJS 中带有延迟和防闪烁的加载指示
- java - Wildfly 13.0 在从 Eclipse 部署时无法部署多个 WAR,否则工作正常
- scala - Download an archive file on the fly using play framework 2.3