2009-04-22 3 views
9

Duplikat zu bekommen ..Python Reflexion - Kann ich diese den Quellcode einer Methodendefinition


I habe eine Methodendefinition, die Erfolg hat vollständig ausgeführt, aber möchte es in der Laufzeit ändern.

für zB: Wenn ich eine Methode

def sayHello(): 
    print "Hello" 

Typ (sayHello) gibt mir die Antwort 'Typ Funktion'. Kann ich die Quelltextzeichenfolge dieses Funktionsobjekts abrufen? Wird es als Sicherheitsproblem angesehen?

+3

Sie dies nicht tun können. Duplizieren: http://stackoverflow.com/questions/427453/how-can-i-get-the-code-of-python-function; http://stackoverflow.com/questions/334851/print-the-code-which-defined-a-lambda-function; http://stackoverflow.com/questions/399991/python-how-do-you-get-python-to-write-down-the-code-of-a-function-it-has-in-memo –

+0

Es ist Python : Sie haben bereits die Quelle. –

+3

Ich würde dringend empfehlen, eine weitere Frage mit mehr Details zu stellen. Ich habe das witzigste Gefühl, dass das, was Sie wirklich tun wollen, nur Schließungen/Dekorateure erfordert, aber da Sie nur den Quellcode der Druckausgabe gefragt haben (und versuchen, ihn irgendwie zu ändern), erhalten Sie enttäuschende Antworten. –

Antwort

2

sayHello.func_code.co_code gibt eine Zeichenfolge zurück, die den kompilierten Code der Methode enthält. Da Python den Code für den Bytecode virtueller Maschinen intern kompiliert, ist dies möglicherweise alles, was übrig ist.

Sie können es zerlegen, aber:

import dis 

def sayHello(): 
    print "hello" 

dis.dis(sayHello) 

Diese Drucke:

 
    1   0 LOAD_CONST    1 ('hello') 
       3 PRINT_ITEM 
       4 PRINT_NEWLINE 
       5 LOAD_CONST    0 (None) 
       8 RETURN_VALUE 

Werfen Sie einen Blick auf Decompyle für eine de-Compiler.

0

Es gibt keine eingebaute Funktion, um den Quellcode einer Funktion zu erhalten. Sie können jedoch eigene Dateien erstellen, wenn Sie Zugriff auf den Quellcode haben (in Ihrem Python/lib-Verzeichnis).

17

Verwenden Sie das Modul überprüfen:

import inspect 
import mymodule 
print inspect.getsource(mymodule.sayHello) 

Die Funktion muss in einem Modul definiert werden, die Sie importieren.

Verwandte Themen