J'ai une base de données qui contient le nom des fonctions Python et une chaîne pour leur code. Je veux que l'utilisateur puisse entrer un code Python et voir le résultat. Le problème est que j'ai besoin de connaître les noms des fonctions qu'ils appellent afin de récupérer le code de la base de données. Par exemple, si elles entrent cubic_fit(1, 2, get_data())
, j'ai besoin d'un moyen d'obtenir les noms de fonctions cubic_fit
et get_data
. Y at-il un bon moyen de le faire?Obtenir les fonctions appelées dans une expression Python
Répondre
La fonction intégrée compile fera pour vous exactement:
>>> compile("cubic_fit(1, 2, get_data())", '<string>', 'eval').co_names
('cubic_fit', 'get_data')
Et il est sûr de courir. Aucun code n'est en cours d'exécution juste compilé.
@Nadia Alramli [En passant], Félicitations pour avoir passé la marque des représentants 10k en un temps record! Je trouve souvent vos réponses à ce point utiles et (et, malheureusement, vous me battez souvent dessus ;-)) Continuez votre bon travail! – mjv
@mjv, merci! Vous êtes plus rapide que moi à coup sûr: 8,079 en 2 mois wow! :) –
Un exemple rapide pour vous a commencé. Notez que vous attendez une sémantique python valide pour que cela fonctionne.
Vous pouvez étendre à analyser aussi vos arguments ...
import token, tokenize, StringIO
def extract_names(src):
rawstr = StringIO.StringIO(unicode(src))
tokens = tokenize.generate_tokens(rawstr.readline)
for i, item in enumerate(tokens):
toktype, toktext, (srow,scol), (erow,ecol), line = item
if token.tok_name[toktype] == 'NAME':
print 'name:', toktext
extract_names("cubic_fit(1, 2, get_data())")
# --> output:
# name: cubic_fit
# name: get_data
Si vous voulez juste les noms, les méthodes compile() et co_names fonctionneront mieux.
Vous pouvez également tirer parti de la capacité de eval() à utiliser n'importe quel objet de mappage en tant que paramètre local. Vous pouvez créer un objet de mappage pour rechercher et compiler les objets de votre base de données selon les besoins de eval().
Exemple:
class LookitUp(object):
def __init__(self):
# simulate some data
self.d = { "foo": "def foo(a):\n return a + 2"}
def __getitem__(self,key):
localdict = {}
c = compile(self.d.get(key,""),"<string>","exec")
eval(c,globals(),localdict)
return localdict[key]
d = LookitUp()
def bar(a):
return a - 1
print "foo from database :",eval("foo(3)",globals(), d)
print "bar from globals():",eval("bar(3)",globals(), d)
print "foo(bar(3)) :",eval("foo(bar(3))",globals(), d)
Résultat:
foo from database : 5
bar from globals(): 2
foo(bar(3)) : 4
Vous devrez peut-être modifier en fonction de ce que votre source dans la base de données ressemble, mais il est un endroit pour commencer.
C'est plus ou moins ce que je prévois de faire :) – exupero
- 1. Obtenir les fonctions appelées avec GDB
- 2. Fonctions de limite appelées par d'autres fonctions spécifiques dans Ada
- 3. RhinoMocks - Récupération des paramètres des fonctions appelées
- 4. Expression régulière pour obtenir des fonctions pascals
- 5. afficher une liste de fonctions appelées par un fichier source
- 6. Les fonctions de délégué ne sont pas appelées
- 7. Besoin de comprendre comment les fonctions javascript sont appelées
- 8. Est-ce que Klocwork détecte les fonctions jamais appelées?
- 9. fonctions taitement en python dans une boucle
- 10. Expression régulière pour les fonctions correspondant à
- 11. varargs dans les fonctions lambda en Python
- 12. portée variable dans les fonctions imbriquées Python
- 13. Fonctions jQuery personnalisées appelées à partir d'événements en ligne
- 14. Python une ligne "for" expression
- 15. utiliser les fonctions aléatoires (python)
- 16. RhinoMocks - retour Spécification des fonctions appelées plus tard
- 17. Java Timers - Fonctions appelées ne se terminant pas!
- 18. Rechercher des fonctions que vous n'avez jamais appelées
- 19. python expression
- 20. indique l'ordre des fonctions javascript qui ont été appelées
- 21. Les fonctions sont-elles déclarées avant ou après les avoir appelées?
- 22. ligne Obtenir une expression régulière
- 23. Python - sortie des fonctions?
- 24. Comment lister toutes les fonctions dans un module Python?
- 25. fonctions Génération à l'intérieur de la boucle avec une expression lambda en python
- 26. expression imbriquée récursive en Python
- 27. Existe-t-il un moyen de vérifier si toutes les fonctions définies sont appelées?
- 28. Comment obtenir une liste de fonctions définies dans une DLL?
- 29. Python - question sur les fonctions d'usine
- 30. Remplacer les fonctions min intégrées en python
vous pourriez avoir besoin d'utiliser un décorateur afin d'attraper le nom de la fonction ... mais il pourrait y avoir un moyen plus facile que je ne sais pas. – jldupont