Frage

Gibt es eine Möglichkeit, eine Liste als eine Funktion Argument übergeben eval () Oder muss ich es in eine Zeichenfolge konvertieren und sie dann als Liste in der Funktion analysieren?

Mein einfaches Beispiel wie folgt aussieht:

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

Ich bin nur nicht sicher, ob es eine bessere Art und Weise fArgs als Liste statt einer Reihe von unter

Hinweis: Die Liste wird von einer JSON-Antwort zur Verfügung gestellt

EDIT: Hier ist Ok ein bisschen mehr von meiner Klasse, so gibt es ein besseres Verständnis, wie ich bin mit 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)

Ich kann dies zu denken falsch sein, aber zu meinem Verständnis ist dies eine sichere Verwendung von eval, weil die einzigen Funktionen, die diejenigen sind, aufgerufen werden können, die im safe_list Wörterbuch aufgeführt sind. Die Funktion ausgeführt werden soll und die Argumente für diese Funktion werden aus einem JSON Objekt extrahiert. Die Argumente sind als Liste zu strukturierenden, wird die Liste zusammen mit dem Beitritt „“ als tatsächliche Argumente interpretiert werden oder nur ein einziges Argument?

War es hilfreich?

Lösung

Wenn Sie mit Python 2.6.x, dann sollten Sie in der Lage sein, den json Modul zu verwenden (siehe py doc 19,2 ). Wenn nicht, dann gibt es python-json verfügbar über den Python-Paket-Index. Beiden Pakete wird ein Lesegerät zur Verfügung stellt für JSON-Daten in einen entsprechenden Python-Datentyp Parsen.

Für Ihre zweite Problem, eine Funktion durch eine Nachricht bestimmt aufrufen, können Sie wie folgt vor:

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

Dieser Ansatz kann ein bisschen sicherer als eval sein, weil es von ‚unsicher‘ Python-Bibliothek Funktionen verhindert in das JSON injiziert. Allerdings müssen Sie immer noch vorsichtig sein, dass die auf Ihre Funktionen gelieferten Daten können nicht zu Problemen führen, manipuliert werden.

Andere Tipps

Angabe von Parametern die folgende Art und Weise funktioniert:

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

so, keine unmittelbare Notwendigkeit für eval (), es sei denn, ich bin Missverständnis etwas.

eine Bibliothek mit JSON Eingang analysieren kann ein besserer Ansatz als eval sein, so etwas wie:

import json
func1(json.loads(fArgs))

Assert-ing, dass Benutzereingaben korrekt ist eine gute Idee wäre, auch.

Die anderen haben einen guten Punkt, dass Sie nicht eval verwenden sollten. Aber, wenn es sein muss:

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

wird die Funktion mit allen Argumenten in der Liste nennen. Dies:

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

wird es mit der Liste der Argumente nennen in nur ein Argument. Vielleicht sogar Sie wollen?

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

, welche die Argumente eval würde auch?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top