2010-04-06 6 views
14

Zastanawiam się, jak dobrze postępować, jeśli chciałbym przedefiniować członków poprzedniej zdefiniowanej klasy w ipython. powiedzieć: Mam zdefiniowane intro klasy jak poniżej, a później chcę przedefiniować część definicji funkcji _print_api. Jakikolwiek sposób to zrobić bez przepisywania go.Dobry sposób na edycję poprzedniej zdefiniowanej klasy w 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) 

Odpowiedz

0

Nie ma naprawdę "dobrego" sposobu na zrobienie tego. Najlepiej można zrobić coś takiego:

# 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 

To będzie działać nawet jeśli masz już obiekty intra określone (to znaczy, kiedy zadzwonić introObject._print_api na obiekcie, który został już utworzony będzie nazywać nowa ustawioną funkcję). Niestety, musisz jeszcze przedefiniować funkcję, ale przynajmniej nie musisz przepisywać całej klasy.

W zależności od przypadku użycia najlepiej zrobić to w oddzielnym module. import klasa i, gdy trzeba coś zmienić, wystarczy użyć funkcji reload(). Nie wpłynie to jednak na wcześniejsze wystąpienia klasy (może to być lub nie być to, czego potrzebujesz).

0

Kiedy dojdziesz do punktu, w którym masz tyle kodu, najłatwiej jest po prostu umieścić go w pliku i import tego konkretnego modułu. Następnie, gdy musisz zaktualizować, możesz edytować plik i ponownie uruchomić instrukcję import, a otrzymasz zaktualizowany kod, chociaż wcześniej zdefiniowane obiekty nie otrzymają aktualizacji.

+2

Aby otrzymać zaktualizowany kod, należy użyć funkcji 'reload (nazwa_modułu)' - ponowne uruchomienie 'import' nie przyniesie żadnego efektu (uważam, że powodem jest to, że jeśli duży program importuje to samo w wielu możliwych lokalizacjach nie wiąże się to z dużą karą za wyniki). –

5

W przypadku korzystania z funkcji edytowania% ipython, można użyć coś takiego this

10

Użyj polecenia% edytować lub jego alias% ed. Zakładając, że klasa intro już istnieje w przestrzeni nazw ipython, wpisanie %ed intro otworzy zewnętrzny edytor kodu źródłowego klasy. Po zapisaniu i wyjściu z edytora kod zostanie wykonany przez ipython, co skutecznie zredefiniuje klasę.

Wadą tego jest to, że wszystkie istniejące już instancje będą nadal powiązane ze starą wersją klasy - jeśli jest to problem, musisz albo odtworzyć obiekty, albo ponownie przypisać obiekt. klasa atrybut wskaż nową wersję klasy.

Można również użyć %ed dla modułów, plików i poprzednich linii wejściowych, np. %ed 5 10:13 16 utworzy i edytuje plik składający się z linii wejściowych ipython 5,10,11,12,13,16.

+0

Naprawdę ładna wskazówka! Kochanie iPython bardziej .. –

+5

Hmm, czy to powinno działać z klasami/funkcjami, które * zostały * zdefiniowane * w ipythonie, czy tylko z importowanymi? Przypadek "klas zdefiniowanych w ipythonie" nie działa dla mnie, otrzymuję komunikat "OSTRZEŻENIE: Plik" Brak ", w którym zdefiniowano" ', nie można odczytać. – weronika

+0

To jest to, czego szukam też - dobry sposób na edytowanie klasy zdefiniowanej w ipythonie. – Zitrax

Powiązane problemy