Question

Existe-t-il un moyen de passer une liste en tant qu'argument de fonction à eval () ou dois-je la convertir en chaîne, puis l'analyser en tant que liste dans la fonction?

Mon exemple simple ressemble à:

 eval("func1(\'" + fArgs + "\')")

Je ne sais pas s'il existe un meilleur moyen de prendre fArgs comme une liste au lieu d'une chaîne

Remarque: La liste est fournie à partir d'une réponse JSON

EDIT: Ok, voici un peu plus de ma classe donc il y a une meilleure compréhension de la façon dont j'utilise eval

def test(arg):
     print arg

#Add all allowed functions to this list to be mapped to a dictionary     
safe_list = ['test']
safe_dict = dict([ (k, locals().get(k, None)) for k in safe_list ])

class Validate:
     def __init__(self, Value, fName, fArgs):
     eval(fName + "(\'" + fArgs + "\')", {"__builtins__":None},safe_dict)

Je me trompe peut-être en pensant cela, mais à ma connaissance, il s'agit d'une utilisation sûre de eval car les seules fonctions pouvant être appelées sont celles répertoriées dans le dictionnaire safe_list. La fonction à exécuter et les arguments de cette fonction sont extraits d'un objet JSON. Les arguments doivent être structurés sous forme de liste. Will rejoindra la liste avec ",", être interprété comme des arguments réels ou juste un seul argument?

Était-ce utile?

La solution

Si vous utilisez Python 2.6.x, vous devriez pouvoir utiliser le module json (voir py doc 19.2 ). Sinon, python-json est disponible dans l'index du package python. Ces deux packages fourniront un lecteur pour analyser les données JSON dans un type de données Python approprié.

Pour votre deuxième problème consistant à appeler une fonction déterminée par un message, vous pouvez procéder comme suit:

def foo():
    print 'I am foo!'
def bar():
    pass
def baz():
    pass

funcs = {'func_a':foo, 'func_b':bar, 'func_c':baz}

funcs['func_a']()

Cette approche peut être un peu plus sûre que eval car elle empêche l'injection de fonctions de bibliothèque python "non sécurisées" dans le fichier JSON. Cependant, vous devez toujours faire attention à ce que les données fournies à vos fonctions ne puissent pas être manipulées pour causer des problèmes.

Autres conseils

Spécification des paramètres de la manière suivante fonctionne:

root@parrot$ more test.py
def func1(*args):
        for i in args:
                print i

l = [1,'a',9.1]
func1(*l)

root@parrot$ python test.py
1
a
9.1

Donc, pas besoin directement de eval (), sauf si je comprends mal quelque chose.

Utiliser une bibliothèque pour analyser les entrées JSON peut être une meilleure approche que eval, comme par exemple:

import json
func1(json.loads(fArgs))

Affirmer que la saisie de l'utilisateur est correcte serait également une bonne idée.

Les autres ont un bon point: ne pas utiliser eval . Mais si vous devez:

eval("func1(%s)" % ", ".join(fArgs))

appellera la fonction avec tous les arguments de la liste. Ceci:

eval("func1([%s])" % ", ".join(fArgs))

l'appellera avec la liste des arguments en un seul argument. Peut-être que vous voulez même cela?

eval("func1([%s])" % ", ".join(map(eval, fArgs)))

qui eval utiliserait également les arguments?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top