Herausfinden, an welcher Zeile im Code eine Funktion anfängt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
dobberph
User
Beiträge: 23
Registriert: Mittwoch 8. November 2006, 09:36

Herausfinden, an welcher Zeile im Code eine Funktion anfängt

Beitragvon dobberph » Mittwoch 8. November 2006, 09:45

Hi ihr,

ich hab ein etwas verrücktes Problem.

Ich hab vereinfacht ausgedrückt, 2 Klassen.
In der ersten Klasse (auch extra Datei) sind verschiedene Funktionen, in der zweiten Klasse (andere Datei) ist eine Funktion, die mir aus der ersten Klasse alle Funktionen als Dictionary liefert.

Mein Problem, ich brauche diese Funktionen sortiert.
1. Lösungsansatz:
vielleicht gibt es eine Möglichkeit, die ich nicht kenne, wie man sich die Funktionen in der aufgeschriebenen Reihenfolge geben lassen kann (z.B. Liste).
2.Lösungsansatz:
Ich hab gehört es gibt irgendwie eine Möglichkeit herauszufinden, an welcher Stelle im Code eine Funktion/Zeile oder so steht.

Die erste Möglichkeit wär performancetechnisch besser, aber ich glaube wenn überhaupt ist die zweite wahrscheinlich machbar.

Wenn jemand dazu ne Idee hat, oder ne Anleitung, würd ich freuen.

Mfg,
DerTobi
Das einzige, was leicht ist, ist verzweifeln...
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 8. November 2006, 10:39

Weiß nicht ganz genau was es werden soll. Hört sich auf jeden Fall schräg an...

Zum Problem "sortiertes Dictionary" gibt es im Wiki was: [wiki]sortiertes Dictionary[/wiki]

Ansonsten schau dir mal imp an: http://docs.python.org/lib/module-imp.html

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
dobberph
User
Beiträge: 23
Registriert: Mittwoch 8. November 2006, 09:36

Beitragvon dobberph » Mittwoch 8. November 2006, 11:03

Hi, erstmal danke für die Antwort, ist aber nicht gazn das, was ich suche.

Sortierte Dictionaries sind nett, aber ich hab halt nix zum sortieren. Hab gerade was gefunden im Inet. Könnte sein, dass man über sys._getframe().f_code irgendwie zum Ziel kommt.
Wer da was näheres weiß bitte melden, aber ich such auch selbst weiter, wenn ichs hab, post ichs hier..
Das einzige, was leicht ist, ist verzweifeln...
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 8. November 2006, 11:04

Ich würde vorschlagen du beschreibst erstmal genau, was am Ende überhaupt raus kommen soll... Also der Zweck des ganzen...

Vielleicht gibt es da einen ganz anderen Lösungsansatz ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
dobberph
User
Beiträge: 23
Registriert: Mittwoch 8. November 2006, 09:36

Beitragvon dobberph » Mittwoch 8. November 2006, 11:46

Jo, also:

es geht um eine automatische Testsequenz.
In der einen Datei stehen verschiedene Funktionen, die vom Testframework ausgelesen werden (aber halt nur als Dictionary, also unsortiert)
Das Testframework ist ein Teil der Schnittstelle zu OpenOffice und soll alle Funktionen (das sind gleichzeitig die Testcases) in ein Dokument schreiben.
Das Problem ist nun, dass einige dieser Funktionen zur besseren Ansicht gruppiert werden sollen, als Unterpunkte.
z.B. sollen die erste 3 Funktionen zu 1.1 gehören, die nächsten zwei zu 1.2 , usw.
Damit ich das einfach machen kann, brauch ich die richtige Reihenfolge der Funktionen, um vorher das Dictionary der Funktionen wieder in die richtige Reihenfolge bringen zu können.

Ich hab mittlerweile selbst rausgefunden, wie man sich innerhalb eines Codes die aktuelle Zeilennummer beschaffen kann:
Das läuft über: < sys._getframe().f_lineno >

Nun fehlt mir eigentlich noch der letzte Schritt, dass ich aus einer anderen Klasse heraus diese Zeile brauche.
Ein Beispiel:

class A:
def eins:
def zwei:
def drei:

class B ():
testcases = {}
def getFunctions():
#testcases wird unsortiert mit den Funktionen aus class A beschrieben

def sortTestCases():
#die fehlt mir
#hier soll testcases sortiert werden nach Zeilennummer der testcases,
#d.h. ich muss von hier aus aus sys._getframe().f_lineno und dem
#class/funct - name auf die Zeilennummer in A kommen.

def writeTestCases():
#hier werden sie dann in der richtigen Reihenfolge und Unterpunkten
#in ooffice geschrieben.

Mfg,
DerTobi
Das einzige, was leicht ist, ist verzweifeln...
BlackJack

Beitragvon BlackJack » Mittwoch 8. November 2006, 12:06

Für so etwas eignet sich das `inspect` Modul:

Code: Alles auswählen

from inspect import findsource, getmembers, ismethod
from BeautifulSoup import BeautifulSoup


def main():
    result = list()
    for name, method in getmembers(BeautifulSoup, ismethod):
        result.append((findsource(method)[1], name))
    result.sort()
    print result
    for line_number, name in result:
        print 'line %5d -> def %s' % (line_number, name)
dobberph
User
Beiträge: 23
Registriert: Mittwoch 8. November 2006, 09:36

Beitragvon dobberph » Mittwoch 8. November 2006, 12:55

Ok, dsa sieht genau wie das aus, was ich brauche.

Aber wie mach ich das, wenn die Klasse BeautifulSoup nicht importiert werden kann, und nichtmal im gleichen Verzeichnis liegt. (Der Grund ist, dass das Ganze gekapslet ist und dazu noch dynamisch erzeugt wird.
Sprich meine Methode weiß noch nicht, wie der Name der Klasse sein wird...)
So wies ist, hab ichs gerade ausprobiert und dann ist das result einfach leer.

Mfg,
DerTobi
Das einzige, was leicht ist, ist verzweifeln...
dobberph
User
Beiträge: 23
Registriert: Mittwoch 8. November 2006, 09:36

Beitragvon dobberph » Mittwoch 8. November 2006, 13:29

Sorry, bin Pythonanfäger... ;D

Also ich importier einfach das ganze Verzeichnis, wo die Klassen drin liegen können.

Code: Alles auswählen

def __getFunctionsPlusLineNumbers(self, klasse):
  result = {}
  members = getmembers(klasse, ismethod)
      
  for name, method in members:
    result[findsource(method)[1]] = name

  return result


So hab ichs verändert, damit ich danach einfach vergleichen kann, ob auch noch Methoden dabei sind, die geerbt wurden.

Danke für die Hilfe,
DerTobi
Zuletzt geändert von dobberph am Mittwoch 8. November 2006, 13:31, insgesamt 4-mal geändert.
Das einzige, was leicht ist, ist verzweifeln...
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 8. November 2006, 13:30


CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd

Wer ist online?

Mitglieder in diesem Forum: pillmuncher