Передача списка в eval () - PullRequest
       31

Передача списка в eval ()

0 голосов
/ 01 декабря 2009

Есть ли способ передать список в качестве аргумента функции в eval () Или мне нужно преобразовать его в строку, а затем проанализировать как список в функции?

Мой простой пример выглядит так:

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

Я просто не уверен, есть ли лучший способ использовать fArgs как список вместо строки

Примечание: Список предоставляется из ответа JSON

РЕДАКТИРОВАТЬ: Хорошо, вот немного больше моего класса, так что есть лучшее понимание того, как я использую 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)

Я могу ошибаться, думая об этом, но, насколько я понимаю, это безопасное использование eval, потому что единственные функции, которые можно вызывать, это те, которые перечислены в словаре safe_list. Функция, которую нужно запустить, и аргументы этой функции извлекаются из объекта JSON. Аргументы должны быть структурированы в виде списка. Будет ли объединение списка вместе с "," интерпретироваться как фактические аргументы или только как один аргумент?

Ответы [ 4 ]

7 голосов
/ 01 декабря 2009

Если вы используете Python 2.6.x, то вы сможете использовать модуль json (см. Py doc 19.2 ). Если нет, то через индекс пакета python доступно python-json . Оба этих пакета обеспечат читателя для анализа данных JSON в соответствующий тип данных Python.

Для вашей второй проблемы вызова функции, определяемой сообщением, вы можете сделать следующее:

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

Этот подход может быть немного более безопасным, чем eval, поскольку он предотвращает внедрение «небезопасных» функций библиотеки Python в JSON. Тем не менее, вы все равно должны быть осторожны, чтобы не доставлять данные, передаваемые вашим функциям, чтобы вызвать проблемы.

2 голосов
/ 01 декабря 2009

Задание параметров следующим образом работает:

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

итак, нет прямой необходимости в eval (), если я что-то не так понимаю.

1 голос
/ 01 декабря 2009

Использование библиотеки для анализа входных данных JSON может быть лучше, чем eval, например:

import json
func1(json.loads(fArgs))

Утверждение, что пользовательский ввод верен, было бы хорошей идеей.

0 голосов
/ 01 декабря 2009

У других есть хороший момент, что вы не должны использовать eval. Но, если вы должны:

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

вызовет функцию со всеми аргументами в списке. Это:

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

вызовет его со списком аргументов в одном аргументе. Может быть, вы даже этого хотите?

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

что будет eval также аргументами?

...