2010-10-25 9 views
13

Angenommen, ich arbeite in der Python-Shell und habe eine Funktion f. Wie kann ich auf den String zugreifen, der seinen Quellcode enthält? (Aus der Shell, nicht durch manuelles Öffnen der Codedatei.)Anzeigen des Codes einer Python-Funktion

Ich möchte, dass dies auch für Lambda-Funktionen funktioniert, die in anderen Funktionen definiert sind.

+0

Duplizieren von all diesen: http://stackoverflow.com/search?q=%5Bpython%5D+view+ Quelle –

Antwort

9

inspect.getsource
Es sieht getsource kann nicht Lambdas Quellcode bekommen.

+0

Yup, leider funktioniert getsource nur, wenn es die Datei öffnen kann, in der der Quellcode existiert. Eine mögliche Sache, die Sie tun können, um zu sehen, was das Lambda tut, ist, Dis zu benutzen, um den Bytecode auseinanderzuziehen. – dcolish

0

Ein Funktionsobjekt enthält nur kompilierten Bytecode, der Quelltext wird nicht beibehalten. Die einzige Möglichkeit zum Abrufen von Quellcode besteht darin, die Skriptdatei zu lesen, von der sie stammt.

Es gibt jedoch nichts besonderes an lambdas: Sie haben immer noch eine f.func_code.co_firstline und co_filename Eigenschaft, die Sie verwenden können, um die Quelldatei abzurufen, solange das Lambda in einer Datei und nicht interaktive Eingabe definiert wurde.

+0

Der kompilierte Bytecode einer Funktion kann mit 'dis.dis' betrachtet werden. – adw

8

nicht unbedingt das, was Sie suchen, aber in ipython können Sie tun:

>>> function_name?? 

und Sie werden den Quellcode der Funktion (nur, wenn es in einer Datei) erhalten. Das funktioniert also nicht für Lambda. Aber es ist definitiv nützlich!

3

vielleicht kann dies helfen (auch Lambda bekommen, aber es ist sehr einfach),

import linecache 

def get_source(f): 

    source = [] 
    first_line_num = f.func_code.co_firstlineno 
    source_file = f.func_code.co_filename 
    source.append(linecache.getline(source_file, first_line_num)) 

    source.append(linecache.getline(source_file, first_line_num + 1)) 
    i = 2 

    # Here i just look until i don't find any indentation (simple processing). 
    while source[-1].startswith(' '): 
     source.append(linecache.getline(source_file, first_line_num + i)) 
     i += 1 

    return "\n".join(source[:-1]) 
Verwandte Themen