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
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
Vous devez vous connecter pour publier un commentaire.
Ce qui suit met les symboles que vous définissez dans votre chaîne dans le dictionnaire d:
Maintenant d['f'] est une fonction de l'objet. Si vous souhaitez utiliser des variables à partir de votre programme dans le code dans votre chaîne, vous pouvez envoyer via d:
Maintenant d['f'] est une fonction de l'objet qui est dynamiquement liée à d['un']. Lorsque vous changez d['un'], vous pouvez changer la sortie de d f'.
c'est tout à fait ce que je cherchais. je suppose que ce que j'étais en manque, je ne pense pas que de mettre des 'def' dans mon instruction exec. mais c'est exactement ce que je voulais. merci.
Cela ne fonctionne pas si x est remplacé par sin(x), même après "from math import *". Il semble qu'il ne fonctionne qu'avec de simples opérations mathématiques comme x + 1.0.
Il fonctionne très bien. Votre périmètre de ne pas obtenir de magie transférés à d, vous devez ajouter le nom que vous souhaitez utiliser, comme suit: d = {"a": 7, "péché": les maths.le péché}, qui ne fonctionnera que si vous avez déjà importé les mathématiques.
Cela a un sens (et travaille), merci.
OriginalL'auteur Gurgeh
Si c'est simplement la preuve de concept puis eval et exec sont fines, vous pouvez également le faire avec des cornichons à cordes, yaml cordes et tout ce que vous décidez d'écrire un constructeur de.
C'est le chemin à parcourir. Utiliser un analyseur de parser votre chaîne, puis de remplir les variables au sein d'un objet de fonction. Si c'est une fonction terminée, alors vous aurez à obtenir un plus puissant analyseur.
Bingo, comme PIL "tostring" et "fromstring" des méthodes, goût yamls de création de l'objet ainsi il semble amusant.
OriginalL'auteur Jakob Bowyer
ne pouvez-vous pas faire quelque chose comme cela?
fondamentalement, de les assembler une fonction réelle au lieu d'assembler une chaîne, puis en essayant de compiler que dans une fonction.
OriginalL'auteur riffraff