Хороший способ отредактировать предыдущий определенный класс в ipython

Я задаюсь вопросом хороший способ следовать, если я хотел бы переопределить членов предыдущего определенного класса в 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)
16
задан leo 6 April 2010 в 15:48
поделиться

4 ответа

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

0
ответ дан 30 November 2019 в 22:37
поделиться

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

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

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

12
ответ дан 30 November 2019 в 22:37
поделиться

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

# 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 для уже созданного объекта, он вызовет новую функцию, которую вы установили) . К сожалению, вам все равно придется переопределять функцию, но, по крайней мере, вам не нужно переписывать весь класс.

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

0
ответ дан 30 November 2019 в 22:37
поделиться

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

5
ответ дан 30 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: