J'ai besoin de générer le code d'une méthode au moment de l'exécution. Il est important de pouvoir exécuter un code arbitraire et d'avoir une docstring.
J'ai trouvé une solution combinant exec
y setattr
Voici un exemple fictif :
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__
Existe-t-il un moyen meilleur / plus sûr / plus idiomatique d'obtenir le même résultat ?
0 votes
Pourquoi avez-vous besoin de cela, avez-vous considéré les autres facilités de métaprogrammation de Python ?
0 votes
Je suis ouvert aux suggestions :-) J'en ai besoin pour générer des règles pour PLY, qui en a besoin en tant que méthodes avec des docstrings. Pour automatiser un peu de code standard, je peux générer des règles dans une boucle au moment de l'exécution.
0 votes
Pouvez-vous donner un meilleur exemple ou expliquer davantage ? L'exemple que vous donnez n'est pas très dynamique puisqu'il s'agit d'une chaîne codée en dur, j'ai du mal à comprendre pourquoi vous ne pouvez pas utiliser les répartiteurs, le polymorphisme, les métaclasses, etc.
0 votes
Je souhaite générer plusieurs méthodes de ce type, dont les noms et les chaînes de documentation varient d'une certaine manière, c'est-à-dire 10 méthodes nommées dynamo1..10 et dont la chaîne de documentation contient également dynamo1..10"