Tengo un grupo de objetos para el que estoy creando una clase para la que quiero almacenar cada objeto como su propio archivo de texto. Realmente me gustaría almacenarlo como una definición de clase de Python que subclasifica la clase principal que estoy creando. Entonces, investigué un poco y encontré un Generador de código Python en effbot.org. Hice un poco de experimentar con ella y esto es lo que ocurrió:Python que genera Python
#
# a Python code generator backend
#
# fredrik lundh, march 1998
#
# [email protected]
# http://www.pythonware.com
#
# Code taken from http://effbot.org/zone/python-code-generator.htm
import sys, string
class CodeGeneratorBackend:
def begin(self, tab="\t"):
self.code = []
self.tab = tab
self.level = 0
def end(self):
return string.join(self.code, "")
def write(self, string):
self.code.append(self.tab * self.level + string)
def indent(self):
self.level = self.level + 1
def dedent(self):
if self.level == 0:
raise SyntaxError, "internal error in code generator"
self.level = self.level - 1
class Point():
"""Defines a Point. Has x and y."""
def __init__(self, x, y):
self.x = x
self.y = y
def dump_self(self, filename):
self.c = CodeGeneratorBackend()
self.c.begin(tab=" ")
self.c.write("class {0}{1}Point()\n".format(self.x,self.y))
self.c.indent()
self.c.write('"""Defines a Point. Has x and y"""\n')
self.c.write('def __init__(self, x={0}, y={1}):\n'.format(self.x, self.y))
self.c.indent()
self.c.write('self.x = {0}\n'.format(self.x))
self.c.write('self.y = {0}\n'.format(self.y))
self.c.dedent()
self.c.dedent()
f = open(filename,'w')
f.write(self.c.end())
f.close()
if __name__ == "__main__":
p = Point(3,4)
p.dump_self('demo.py')
que se siente muy feo, ¿hay un/una mejor manera más limpia/más Pythonic para hacer esto? Tenga en cuenta que esta no es la clase con la que realmente intento hacer esto, esta es una clase pequeña que puedo simular fácilmente en no demasiadas líneas. Además, las subclases no necesitan tener la función de generación en ellas, si lo necesito de nuevo, puedo simplemente llamar al generador de códigos desde la superclase.
No use pestañas para sangrar Python, use espacios :) –
Sí, establece eso como el valor predeterminado, pero sobreescribí esa variable con 4 espacios. – Jonathanb