Ho bisogno di generare codice per un metodo in fase di esecuzione. È importante essere in grado di eseguire codice arbitrario e disporre di una docstring.Creazione metodo dinamico/runtime (generazione codice) in Python
mi si avvicinò con una soluzione che combina exec
e setattr
, ecco un esempio fittizio:
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__
C'è un// modo più idiomatico sicuro meglio di ottenere lo stesso risultato?
Perché avete bisogno di questo, ha fatto si considerano le altre strutture metaprogrammazione in Python? –
Sono aperto ai suggerimenti :-) Ho bisogno di questo per generare regole per PLY, che ha bisogno di loro come metodi con docstring. Per automatizzare un codice boilerplate, posso generare alcune regole in un loop in fase di esecuzione –
Puoi dare un esempio migliore o spiegarne altre? L'esempio che fornisci non è molto dinamico poiché è una stringa hard coded, ho difficoltà a capire perché non puoi usare dispatcher, polimorfismi, metaclassi, ecc. –