2010-04-06 5 views
14

Me pregunto si es una buena forma de seguir si quisiera redefinir los miembros de una clase definida previamente en ipython. decir: He definido una introducción de clase como a continuación, y luego quiero redefinir parte de la definición de la función _print_api. Cualquier forma de hacerlo sin volver a escribirlo.Una buena manera de editar la clase definida anteriormente en 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) 

Respuesta

0

No hay realmente una "buena" manera de hacerlo. Lo mejor que puede hacer es algo como esto:

# 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 

Esto funcionará incluso si ya tiene objetos de introducción definidos (es decir, cuando se llama introObject._print_api sobre un objeto que ya se ha creado se llamará el nuevo función que configuró). Desafortunadamente, todavía tiene que redefinir la función, pero al menos no tiene que volver a escribir toda la clase.

Dependiendo de su caso de uso, lo mejor que puede hacer es tenerlo en un módulo separado. import la clase y, cuando necesite cambiar algo, solo use la función reload(). Sin embargo, esto no afectará las instancias previas de la clase (esto puede o no ser lo que desea).

0

Al llegar al punto en el que tienes que mucho código, es más fácil sólo para ponerlo en un archivo y import ese módulo en particular. Luego, cuando necesite actualizar, puede editar el archivo y volver a ejecutar la declaración import y obtendrá el código actualizado, aunque los objetos definidos anteriormente no recibirán las actualizaciones.

+2

Para obtener el código actualizado, en realidad tiene que usar la función 'reload (modulename)' - ejecutar 'import' nuevamente no tendrá ningún efecto (creo que la razón es que si un programa grande importa lo mismo en múltiples ubicaciones posibles, no incurre en una gran penalización de rendimiento). –

5

Si utiliza las características de edición% IPython, se puede usar algo como this

10

Utilice el comando% editar o su alias% ed. Asumiendo que la clase de introducción ya existe en el espacio de nombres de ipython, al escribir %ed intro se abrirá un editor externo en el código fuente de la clase. Cuando guarde y salga del editor, el código será ejecutado por ipython, redefiniendo efectivamente la clase.

La desventaja de esto es que cualquier instancia que ya exista estará vinculada a la versión anterior de la clase. Si esto es un problema, deberá volver a crear los objetos o volver a asignar el obj. clase atributo para apuntar a la nueva versión de la clase.

También puede usar %ed en módulos, archivos y líneas de entrada anteriores, p. %ed 5 10:13 16 creará y editará un archivo compuesto por líneas de entrada ipython 5,10,11,12,13,16.

+0

¡Extremidad realmente agradable! Amar iPython más y más ... –

+5

Hmm, ¿debería funcionar esto con las clases/funciones que fueron * definidas * en ipython, o solo con las importadas? El caso "clases definidas en ipython" no funciona para mí, obtengo 'ADVERTENCIA: El archivo 'Ninguno' donde '' fue definido no puede leerse. – weronika

+0

Eso es lo que estoy buscando también, una buena manera de editar una clase que se definió en ipython. – Zitrax

Cuestiones relacionadas