la création d'un objet de fonction à partir d'une chaîne

Question: est-il un moyen de faire un objet de fonction en python à l'aide de cordes?


Info: je suis en train de travailler sur un projet qui, je l'stocker des données dans un sqlite3 serveur backend. rien à fou à ce sujet. un DAL de classe est très souvent fait par le biais de la génération de code, car le code est tellement banal. Mais cela m'a donné une idée. En python quand un attribut n'est pas trouvé, si vous définissez la fonction "getattr" il va appeler qu'avant d'erreurs. donc, la façon dont je l'ai trouver, par l'intermédiaire d'un analyseur et d'une logique de l'arbre, j'ai pu générer dynamiquement le code dont j'ai besoin sur son premier appel, puis enregistrez la fonction de l'objet comme un local attrib. par exemple:

DAL.getAll()

#getAll() not found, call __getattr__

DAL.__getattr__(self,attrib)#in this case attrib = getAll

##parser logic magic takes place here and i end up with a string for a new function

##convert string to function

DAL.getAll = newFunc

return newFunc

J'ai essayé de le compiler la fonction, mais exec, et eval sont loin d'être satisfaisantes en termes de pouvoir d'accomplir ce genre d'exploit. j'ai besoin de quelque chose qui va permettre à plusieurs lignes de fonction. Est-il une autre façon de le faire en plus de ceux qui n'implique pas l'écriture au disque? Encore une fois je suis en train de faire un fonction de l'objet de façon dynamique.

P. S.: oui, je sais que c'est horrible de sécurité et des problèmes de stabilité. oui, je sais que c'est une horrible en-efficace de le faire. dois-je prendre soin? pas de. c'est une preuve de concept. "python peut faire cela? Peut-il créer dynamiquement un fonction de l'objet" est ce que je veux savoir, pas une meilleure alternative. (si hésitez pas à virer de bord sur les supérieure des alternatives après avoir répondu à la question à portée de main)

"exec, et eval sont loin d'être satisfaisantes en termes de pouvoir d'accomplir ce genre d'exploit"? Quoi? exec le fait parfaitement. Ce certains une erreur ou un problème rencontrez-vous?
essayer de retourner quelque chose de exec.
exec passe juste des trucs, ils font ce qu'ils disent sur la boite. a = eval("123") va se lier 123 à a. Vous obtenez la valeur de l'expression à l'arrière.
attendre. Je ne peut pas avoir vu eval pour tous il est potentiel. mais je ne peux toujours pas faire des choses comme les importations et les retours. partie intégrante de ce que je suis en train de faire.
Exec ne retourne rien. Il crée la fonction. Après exec la fonction existe et vous pouvez l'utiliser.

OriginalL'auteur Narcolapser | 2011-05-23