Domanda

Esiste un modo per passare un elenco come argomento di funzione a eval () O devo convertirlo in una stringa e quindi analizzarlo come un elenco nella funzione?

Il mio semplice esempio è simile a:

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

Non sono sicuro che esista un modo migliore di prendere fArgs come elenco anziché come stringa

Nota: L'elenco è fornito da una risposta JSON

EDIT: Ok ecco un po 'di più della mia classe, quindi c'è una migliore comprensione di come sto usando 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)

Potrei sbagliarmi nel pensare questo, ma a mio avviso questo è un uso sicuro di eval perché le uniche funzioni che possono essere chiamate sono quelle elencate nel dizionario safe_list. La funzione da eseguire e gli argomenti per quella funzione vengono estratti da un oggetto JSON. Gli argomenti devono essere strutturati come un elenco, Will unirà l'elenco insieme a " ;, " essere interpretato come vero argomento o solo un singolo argomento?

È stato utile?

Soluzione

Se stai usando Python 2.6.x, dovresti essere in grado di usare il modulo json (vedi py doc 19.2 ). In caso contrario, è disponibile python-json disponibile tramite l'indice del pacchetto python. Entrambi questi pacchetti forniranno un lettore per l'analisi dei dati JSON in un tipo di dati Python appropriato.

Per il tuo secondo problema di chiamata a una funzione determinata da un messaggio, puoi fare quanto segue:

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']()

Questo approccio può essere un po 'più sicuro di eval perché impedisce che le funzioni della libreria Python "non sicure" vengano iniettate nel JSON. Tuttavia, è comunque necessario essere cauti sul fatto che i dati forniti alle proprie funzioni non possono essere manipolati per causare problemi.

Altri suggerimenti

Specifica dei parametri nel modo seguente funziona:

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

quindi, non c'è bisogno diretto di eval (), a meno che non fraintenda qualcosa.

L'uso di una libreria per analizzare l'input JSON può essere un approccio migliore di eval, qualcosa come:

import json
func1(json.loads(fArgs))

Anche affermare che l'input dell'utente è corretto sarebbe una buona idea.

Gli altri hanno un buon punto, che non dovresti usare eval . Ma, se devi:

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

chiamerà la funzione con tutti gli argomenti nell'elenco. Questo:

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

lo chiamerà con l'elenco degli argomenti in un solo argomento. Forse lo vuoi anche tu?

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

che evalerebbe anche gli argomenti?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top