Necesito generar código para un método en tiempo de ejecución. Es importante poder ejecutar código arbitrario y tener una docstring.Creación de métodos dinámicos/en tiempo de ejecución (generación de código) en Python
me ocurrió una solución que combina exec
y setattr
, aquí hay un ejemplo ficticio:
class Viking(object):
def __init__(self):
code = '''
def dynamo(self, arg):
""" dynamo's a dynamic method!
"""
self.weight += 1
return arg * self.weight
'''
self.weight = 50
d = {}
exec code.strip() in d
setattr(self.__class__, 'dynamo', d['dynamo'])
if __name__ == "__main__":
v = Viking()
print v.dynamo(10)
print v.dynamo(10)
print v.dynamo.__doc__
¿Hay una manera mejor/más seguro/más idiomática de lograr el mismo resultado?
¿Por qué necesita eso, ¿se tiene en cuenta el resto de instalaciones metaprogramación en Python? –
Estoy abierto a sugerencias :-) Necesito esto para generar reglas para PLY, que las necesita como métodos con docstrings. Para automatizar un código repetitivo, puedo generar algunas reglas en un ciclo en tiempo de ejecución –
¿Puedes dar un mejor ejemplo o explicar más? El ejemplo que das no es muy dinámico ya que es una cadena codificada, tengo problemas para entender por qué no puedes usar despachadores, polimorfismo, metaclases, etc. –