2016-03-21 8 views
1

Ich möchte den Code von tatsächlichen Python-Objekten greifen. Dies ist die gegenteilige Idee von AST und parse, ich habe ein Objekt im Speicher und möchte den Quellcode neu erstellen. Ich möchte nicht in den Byte-Code unten erhalten, die übermäßige ist, ich will nur eine Darstellung des Codes, der das Objekt gemacht:Quelle aus Objekten rekonstruieren

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) 

ich die Quelle aller Modelle wünschen, aber mit ast scheint zu haarig besonders Seit django bietet das apps Modul, um alle Modelle zu greifen. Jetzt muss ich es nur untranslate

Danke

+1

muss es für jedes Objekt arbeiten, oder nur eine begrenzte Menge? Erwarten Sie Zugang zu den Quellen? Wenn Sie Zugriff haben, können Sie einen Parser schreiben, der im Namensraum des Objekts nach dem String 'class ' sucht. Wenn die Menge sehr begrenzt ist und Sie einen schnellen Test durchführen möchten, können Sie die '__repr__'-Methode dieser Objekte immer mit der Zeichenfolge überschreiben, die Sie werden möchten. Lassen Sie mich wissen, wenn dies alles in Ordnung wäre, um einen Versuch zu machen –

+1

vergiss es, Simeon genagelt es –

+0

es muss für alle benutzerdefinierten geschriebenen Modelle arbeiten. Ich kann alle Dirs unter Hauptprojektordner ergreifen, um zu überprüfen, ob die App, die ich bekomme, benutzerdefinierte oder 3rd Party ist, aber es ist schneller, die Apps zu verwenden und nur zu überprüfen, ob das Modell in unserer Quelle – codyc4321

Antwort

2

Sie in der Lage sein, den Quellcode zu erhalten, unter Verwendung von:

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

Dies funktioniert nur, wenn das Argument ein Modul, Klasse, Methode, Funktion , Traceback-, Frame- oder Code-Objekt. Wenn Python den Quellcode nicht erhalten kann, wird ein IOError ausgelöst.

+0

ist, die perfekt funktioniert. Aus irgendeinem Grund dachte ich, dass ich nur Bytecode mache. Was ist das Modul, mit dem man im Bytecode Schritt für Schritt vorgehen kann? – codyc4321

+1

@ codyc4321: das ist 'import dis; dis.dis (obj) ' –