Python 从对象重构源

Python 从对象重构源,python,parsing,python-3.x,abstract-syntax-tree,Python,Parsing,Python 3.x,Abstract Syntax Tree,我想从实际的python对象中获取代码。这与AST和parse的想法相反,我在内存中有一个对象,我想重新创建源代码。我不想深入讨论过多的字节码,我只想得到生成对象的代码的表示: In [24]: from django.apps import apps In [25]: x= apps.get_app('accounts') In [26]: x Out[26]: <module 'mysite.accounts.models' from '/home/cchilders/work_pr

我想从实际的python对象中获取代码。这与AST和parse的想法相反,我在内存中有一个对象,我想重新创建源代码。我不想深入讨论过多的字节码,我只想得到生成对象的代码的表示:

In [24]: from django.apps import apps
In [25]: x= apps.get_app('accounts')

In [26]: x
Out[26]: <module 'mysite.accounts.models' from '/home/cchilders/work_projects/mysite/mysite/accounts/models.py'>

In [27]: x.
x.BusinessUnit                       x.models           

In [35]: bizunit = x.BusinessUnit

In [36]: type(bizunit)
Out[36]: django.db.models.base.ModelBase

import something

bizunit_code = something.something(bizunit)
[24]中的
:从django.apps导入应用程序
在[25]中:x=apps.get_app('accounts'))
In[26]:x
出[26]:
在[27]:x中。
x、 业务单元x.models
在[35]中:bizunit=x.BusinessUnit
In[36]:类型(bizunit)
Out[36]:django.db.models.base.ModelBase
进口东西
bizunit_code=something.something(bizunit)
我想要所有模型的源代码,但是使用ast似乎太麻烦了,特别是因为django提供了
apps
模块来获取所有模型。现在我只需要把它解译出来


谢谢

您可以通过以下方式获得源代码:

import inspect
print(inspect.getsource(biz unit))

这仅在参数是模块、类、方法、函数、回溯、帧或代码对象时有效。如果Python无法获取源代码,那么这将引发一个
IOError

如果要从AST重建源文本,可以构建预打印程序


请参阅我关于如何执行此操作的SO答案:

它必须适用于任何对象,还是仅适用于有限的对象集?您希望访问这些来源吗?如果您确实具有访问权限,则可以编写一个解析器,在对象的命名空间中查找字符串
class
。如果集合非常有限,并且您需要快速测试,则始终可以使用您想要成为的字符串覆盖这些对象的
\uuuu repr\uuuu
方法。让我知道,如果这些都可以尝试一下,Simeon确定它必须适用于所有自定义编写的模型。我可以抓取主项目文件夹下的所有目录,检查我得到的应用程序是定制的还是第三方的,但使用这些应用程序更快,只需检查模型是否在我们的sourceyep中,并且运行良好。出于某种原因,我认为expect只是执行字节码。什么模块可以让你在字节码中一步一步地走?@codyc4321:那是
导入dis;dis.dis(obj)