-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathsafe_eval.r2py
62 lines (45 loc) · 1.4 KB
/
safe_eval.r2py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
"""
Author: Armon Dadgar
Description:
Provides a method to safely evaluate a string.
"""
# Provides a method to safely evaluate a string
def safe_eval(code, context=None):
"""
<Purpose>
Allows code to be safely evaluated.
<Arguments>
code:
The code to be evaluated.
context:
The context to evaluate the code in. If not specified, an empty context is used.
<Exceptions>
As with the code to be evaluated
<Returns>
The result of evaluating the code.
<Notes>
To perform the evaluation, a new entry '_result' is added into the
context prior to execution and removed afterward. This will override any
existing value. The code is evaluated by prepending '_result = ', so
make sure the code still is sane after this. See safe_exec.
As an example:
val = safe_eval('123')
print val # 123
val = safe_eval('10 * 20 / 5')
print val # 40
val = safe_eval('print "Hi!"') # Exception, _result = print "Hi!" is not valid.
"""
# Prepend _result to the code, so that we can get the result back
code = "_result = " + code
# Get a context
if context == None:
context = {}
# Try to evaluate this
virt_space = VirtualNamespace(code)
context = virt_space.evaluate(context)
# Get the value
value = context["_result"]
# Clear the special _result entry
del context["_result"]
# Return the result
return value