Хороший способ отредактировать предыдущий определенный класс в ipython - PullRequest
15 голосов
/ 06 апреля 2010

Мне интересно найти хороший способ следовать, если я хотел бы переопределить членов предыдущего определенного класса в ipython.скажем: я определил введение класса, как показано ниже, и позже я хочу переопределить часть определения функции _print_apiЛюбой способ сделать это без перепечатывания.

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)

Ответы [ 4 ]

12 голосов
/ 06 апреля 2010

Используйте команду% edit или ее псевдоним% ed. Предполагая, что класс intro уже существует в пространстве имен ipython, ввод %ed intro откроет внешний редактор исходного кода для класса. Когда вы сохраняете и выходите из редактора, ipython выполняет код, эффективно переопределяя класс.

Недостатком этого является то, что любые уже существующие экземпляры будут по-прежнему связаны со старой версией класса - если это проблема, вам нужно либо воссоздать объекты, либо переназначить класс obj. атрибут, указывающий на новую версию класса.

Вы также можете использовать %ed для модулей, файлов и предыдущих строк ввода, например, %ed 5 10:13 16 создаст и отредактирует файл, состоящий из строк ввода ipython 5,10,11,12,13,16.

5 голосов
/ 06 апреля 2010

Если вы используете функции редактирования IPython%, вы можете использовать что-то вроде this

0 голосов
/ 06 апреля 2010

Когда вы дошли до того, что получили столько кода, проще всего поместить его в файл и import этого конкретного модуля. Затем, когда вам нужно обновить, вы можете отредактировать файл и повторно запустить оператор import, и вы получите обновленный код, хотя ранее определенные объекты не получат обновления.

0 голосов
/ 06 апреля 2010

Нет действительно "хорошего" способа сделать это. Лучшее, что вы можете сделать, это что-то вроде этого:

# 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

Это будет работать, даже если вы уже определили объекты вступления (то есть когда вы вызываете introObject._print_api для уже созданного объекта, он вызовет новую функцию, которую вы установили). К сожалению, вам все еще нужно переопределить функцию, но по крайней мере вам не нужно переписывать весь класс.

В зависимости от вашего варианта использования, лучше всего иметь его в отдельном модуле. import класс и, когда вам нужно что-то изменить, просто используйте функцию reload(). Однако это не повлияет на предыдущие экземпляры класса (это может или не может быть тем, что вы хотите).

...