Pergunta

Existe uma maneira de passar uma lista como um argumento de função para eval () Ou eu tenho para convertê-lo em uma string e, em seguida, analisá-lo como uma lista na função?

Meu exemplo aparência simples, como:

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

Eu sou apenas não tenho certeza se existe uma melhor maneira de tomar FARGS como uma lista em vez de uma string

Nota: A lista é fornecida a partir de uma resposta JSON

EDIT: Ok, aqui está um pouco mais da minha classe por isso há uma melhor compreensão de como eu estou 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)

Eu posso estar errado em pensar isso, mas para minha compreensão este é um uso seguro de eval porque as únicas funções que podem ser chamadas são as que estão listadas no dicionário safe_list. A função a ser executada e os argumentos para a função que estão a ser extraída para fora de um objeto JSON. Os argumentos devem ser estruturada como uma lista, Will se juntar à lista, juntamente com "" ser interpretadas como argumentos reais ou apenas um único argumento?

Foi útil?

Solução

Se você estiver usando Python 2.6.x, então você deve ser capaz de usar o módulo json (ver doc py 19,2 ). Se não, então não há python-json disponível através do índice de pacotes python. Ambos os pacotes irá fornecer um leitor para analisar os dados JSON em um tipo de dados Python apropriada.

Para o seu segundo problema de chamar uma função determinada por uma mensagem, você pode fazer o seguinte:

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

Esta abordagem pode ser um pouco mais seguro do que eval porque impede 'inseguro' python funções de biblioteca de ser injetado na JSON. No entanto, você ainda precisa ser cauteloso que os dados fornecidos para suas funções não podem ser manipulados para causar problemas.

Outras dicas

obras da seguinte forma :

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

Assim, não há necessidade direta para eval (), a menos que eu estou mal-entendido alguma coisa.

Usando uma biblioteca para analisar entrada JSON pode ser uma abordagem melhor do que eval, algo como:

import json
func1(json.loads(fArgs))

Assert-ing que a entrada do usuário é correto seria uma boa idéia também.

Os outros têm um bom ponto, que você não deve estar usando eval. Mas, se você deve:

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

irá chamar a função com todos os argumentos na lista. Isto:

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

vai chamá-lo com a lista de argumentos em apenas um argumento. Talvez você ainda quer isso?

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

que eval os argumentos bem?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top