2016-03-21 4 views
1

Я хотел бы захватить код из реальных объектов 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) 

Я хочу, чтобы источник всех моделей, но с использованием асты кажется слишком волосатыми, особенно поскольку django предоставляет модуль apps для захвата всех моделей. Теперь мне просто нужно Отменить перевод его

Спасибо

+1

он должен работать для любого объекта, или только ограниченный набор? вы ожидаете получить доступ к источникам? Если у вас есть доступ, вы можете написать парсер, который ищет строку 'class ' в пространстве имен объекта. Если набор очень ограничен и вам нужен быстрый тест, вы всегда можете переопределить метод __repr__' этих объектов с помощью строки, которую хотите стать. Дайте мне знать, если что-нибудь из этого будет в порядке, чтобы попробовать –

+1

nevermind, Симеон прибил его –

+0

, он должен работать для всех пользовательских письменных моделей. Я могу захватить все каталоги в основной папке проекта, чтобы проверить, является ли приложение, которое я получаю, обычным или сторонним, но быстрее использовать приложения и просто проверить, находится ли модель в нашем источнике – codyc4321

ответ

2

Вы можете получить исходный код с помощью:

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

Это работает, только если аргумент представляет собой модуль, класс, метод, функция , трассировка, кадр или объект кода. Если Python не сможет получить исходный код, это приведет к повышению IOError.

+0

yep, который отлично работает. по какой-то причине я думал, что ожидание будет делать только байт-код. Что такое модуль, который позволяет вам шаг за шагом в байт-коде? – codyc4321

+1

@ codyc4321: это 'import dis; dis.dis (OBJ) ' –

0

Если вы хотите восстановить исходный текст из AST, вы можете создать симпатичный принтер.

Смотрите мой SO ответ о том, как это сделать: https://stackoverflow.com/a/5834775/120163

Смежные вопросы