4 Stimmen

Umschreiben eines Python-Skripts und Einfügen einer Methode in jede Klasse des Skripts

Angenommen, ich habe ein Python-Modul foo.py, das enthält:

class Foo(object):
    def __init__(self):
        pass

Als Nächstes möchte ich dieses Skript analysieren und eine Methode in jede seiner Klassen einfügen, indem ich es etwa so umschreibe:

class Foo(object):
    def __init__(self):
        pass
    def my_method(self):
        pass # do some stuff here

Ich habe bemerkt, Python 2.6 hat eine ast Modul, das für diese verwendet werden könnte, aber leider muss ich dies in Python 2.5 zu tun. Alle Vorschläge sind willkommen.

2voto

Gurgeh Punkte 2080

Ich verstehe, was Sie versuchen zu tun, aber wenn Ihr Quellcode ist einigermaßen einfach, vielleicht könnten Sie das ganze Parsen und Schreiben zurück insgesamt überspringen und nur eine Regexp ausführen?

Etwa so:

re.sub('^class\s+(\w+):\s*\n', 'class \\1:\n%s' % method_source, file_source, flags=re.M)

Achten Sie nur auf die richtige Einrückung.

1voto

Tim McNamara Punkte 17453

Haben Sie das Drehbuch schon? Sie sollten es sofort patchen können. Um Ihre aktuellen Anforderungen zu erfüllen, wäre so etwas wie das hier in Ordnung:

class Foo(object):
    def my_method(self):
        pass

Alternativ könnten Sie auch definieren my method und fügen Sie sie dem Foo Klasse als Attribut:

def my_method(self):
    pass

Foo.my_method = my_method
#or
Foo.__dict__.my_method = my_method

0voto

Ioan Alexandru Cucu Punkte 11629

Das wäre eine Lösung:

class Foo(object):
    def __init__(self):
        pass

import new

def some_func(self):
    print "foobar"

Foo.my_method = new.instancemethod(some_func, None, Foo)

Das Problem ist, dass ich die neuen Methodendefinitionen nicht am Ende der Datei anhängen möchte. Ich möchte, dass die Klassen im generierten Skript wie folgt aussehen:

class Foo(object):
    def __init__(self):
        pass
    def my_method(self):
        print "foobar"

kann aber keine Lösung für dieses Problem finden, ohne einen Sintax-Baum zu erstellen, zu modifizieren und dann zurückzuschreiben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X