문제

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)

나는 이것을 생각하는 데 잘못되었을 수도 있지만, 내가 이해할 수있는 유일한 기능은 Safe_list Dictionary에 나열된 기능이기 때문에 이것은 평가의 안전한 사용입니다. 실행되는 함수와 해당 함수에 대한 인수는 JSON 객체에서 추출됩니다. 인수는 목록으로 구성되어야하며 "실제 인수 또는 단일 주장으로 해석 될"과 함께 목록에 합류 할 것인가?

도움이 되었습니까?

해결책

Python 2.6.x를 사용하는 경우 json 모듈 (PY Doc 참조 19.2). 그렇지 않다면, 거기에 있습니다 Python-json Python 패키지 인덱스를 통해 사용할 수 있습니다. 이 패키지는 모두 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 '안전하지 않은'파이썬 라이브러리 기능이 JSON에 주입되는 것을 방지하기 때문입니다. 그러나 기능에 제공된 데이터가 문제를 일으키기 위해 조작 할 수 없다는 것이 여전히 신중해야합니다.

다른 팁

매개 변수 지정 다음 방법 공장:

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 ()가 직접 필요하지 않습니다.

라이브러리를 사용하여 JSON 입력을 구문 분석하는 것보다 다음과 같은 것보다 더 나은 접근 방식 일 수 있습니다.

import json
func1(json.loads(fArgs))

사용자 입력이 정확하다고 주장하는 것도 좋은 생각이 될 것입니다.

다른 사람들은 당신이 사용해서는 안된다는 좋은 지적을 가지고 있습니다. eval. 그러나, 당신이해야한다면 :

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

목록의 모든 인수와 함께 함수를 호출합니다. 이것:

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

하나의 인수로 인수 목록과 함께 호출 할 것입니다. 어쩌면 당신은 이것을 원하십니까?

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

그럴 것입니다 eval 논쟁도?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top