2010-04-06 2 views
14

Ich frage mich, eine gute Möglichkeit zu folgen, wenn ich die Mitglieder einer zuvor definierten Klasse in Ipython neu definieren möchten. sagen: Ich habe eine Klasse Intro wie unten definiert, und später möchte ich einen Teil der Funktionsdefinition _print_api neu definieren. Irgendeine Möglichkeit, das zu tun, ohne es neu zu tippen.Gute Möglichkeit zum Bearbeiten der zuvor definierten Klasse in Ipython

class intro(object): 
    def _print_api(self,obj): 
      def _print(key): 
        if key.startswith('_'): 
          return '' 
        value = getattr(obj,key) 
        if not hasattr(value,im_func): 
          doc = type(valuee).__name__ 
        else: 
          if value.__doc__ is None: 
            doc = 'no docstring' 
          else: 
            doc = value.__doc__ 
        return '  %s  :%s' %(key,doc) 
        res = [_print(element) for element in dir(obj)] 
        return '\n'.join([element for element in res if element != '']) 
    def __get__(self,instance,klass): 
      if instance is not None: 
        return self._print(instance) 
      else: 
        return self._print_api(klass) 

Antwort

0

Es gibt nicht wirklich einen "guten" Weg, es zu tun. Das Beste, was Sie tun können, ist so etwas wie dieses:

# class defined as normally above, but now you want to change a funciton 
def new_print_api(self, obj): 
    # redefine the function (have to rewrite it) 
    ... 
# now set that function as the _print_api function in the intro class 
intro._print_api = new_print_api 

Dies wird auch funktionieren, wenn Sie bereits Intro Objekte definiert (das heißt, wenn Sie introObject._print_api auf ein Objekt aufrufen, die bereits erstellt wurde wird der neue Anruf Funktion, die Sie einstellen). Leider müssen Sie die Funktion noch neu definieren, aber Sie müssen nicht die gesamte Klasse neu schreiben.

Abhängig von Ihrem Anwendungsfall ist es am besten, wenn Sie es in einem separaten Modul haben. import die Klasse und, wenn Sie etwas ändern müssen, verwenden Sie einfach die reload() Funktion. Dies wirkt sich jedoch nicht auf vorherige Instanzen der Klasse aus (dies kann oder kann nicht das sein, was Sie möchten).

0

Wenn Sie an den Punkt kommen, wo Sie so viel Code haben, ist es am einfachsten, es einfach in eine Datei und import dieses bestimmte Modul zu setzen. Wenn Sie dann aktualisieren müssen, können Sie die Datei bearbeiten und die import-Anweisung erneut ausführen, und Sie erhalten den aktualisierten Code, obwohl zuvor definierte Objekte die Aktualisierungen nicht erhalten.

+2

Um den aktualisierten Code zu bekommen, müssen Sie tatsächlich die 'reload (modulename)' -Funktion verwenden - das erneute Ausführen von 'import' hat keine Auswirkung (Ich glaube der Grund dafür ist, dass ein großes Programm dasselbe importiert an mehreren möglichen Orten verursacht dies keine große Leistungseinbuße). –

5

Wenn Sie die IPython% Bearbeitungsfunktionen verwenden, können Sie so etwas wie this

10

Verwenden Sie den% Bearbeitungsbefehl oder dessen Alias% ed verwenden. Unter der Annahme, dass die Intro-Klasse bereits im ipython-Namespace vorhanden ist, wird durch Eingabe von %ed intro ein externer Editor für den Quellcode der Klasse geöffnet. Wenn Sie den Editor speichern und beenden, wird der Code von ipython ausgeführt, wodurch die Klasse neu definiert wird.

Der Nachteil davon ist, dass alle Instanzen, die bereits existieren, immer noch an die alte Version der Klasse gebunden sind - wenn dies ein Problem ist, müssen Sie entweder die Objekte neu erstellen oder das Objekt neu zuweisen. Klasse Attribut, um auf die neue Version der Klasse zu verweisen.

Sie können auch für Module, Dateien und vorherige Eingabezeilen verwenden, z. %ed 5 10:13 16 erstellt und bearbeitet eine Datei, die aus den ipython-Eingangszeilen 5,10,11,12,13,16 besteht.

+0

Wirklich netter Tipp! Loving iPython mehr und mehr .. –

+5

Hmm, sollte dies mit Klassen/Funktionen funktionieren, die in ipython * definiert wurden * oder nur mit importierten? Der "classes defined in ipython" Fall funktioniert nicht für mich, ich bekomme 'WARNUNG: Die Datei 'None' wo '' definiert wurde kann nicht gelesen werden. ' – weronika

+0

Das ist, was ich suche Auch - eine gute Möglichkeit, eine Klasse zu bearbeiten, die in ipython definiert wurde. – Zitrax

Verwandte Themen