3535
3636import dis
3737import sys
38+ import math
3839
3940
4041builtins_whitelist = {
5859 "sum" ,
5960}
6061
61- if sys .version_info [0 :2 ] > = (3 , 11 ):
62+ if sys .version_info [0 :2 ] = = (3 , 11 ):
6263 opcode_whitelist = {
6364 # Shared with Python 3.10.
6465 'POP_TOP' ,
112113 'BUILD_STRING' ,
113114 }
114115
115- else :
116+ elif sys . version_info [ 0 : 2 ] == ( 3 , 10 ) :
116117 # Python 3.10.
117118 opcode_whitelist = {
118119 '<0>' ,
185186 'BUILD_STRING' ,
186187 }
187188
189+ elif sys .version_info [0 :2 ] == (3 , 12 ):
190+ opcode_whitelist = {
191+ '<8>' ,
192+ '<6>' ,
193+ '<10>' ,
194+ "RESUME" ,
195+ "CACHE" ,
196+ "LOAD_NAME" ,
197+ "CALL" ,
198+ "RETURN_VALUE" ,
199+ "LOAD_CONST" ,
200+ "PUSH_NULL" ,
201+ "UNARY_NEGATIVE" ,
202+ "BINARY_OP" ,
203+ "POP_JUMP_IF_FALSE" ,
204+ "POP_TOP" ,
205+ "FORMAT_VALUE" ,
206+ "END_FOR" ,
207+ "BUILD_STRING" ,
208+ "INTERPRETER_EXIT" ,
209+ }
210+
211+ else :
212+ raise RuntimeError ("Python version not support!" )
213+
214+
188215# Convert names to index
189216opname_reverse = {name : index for index , name in enumerate (dis .opname )}
190217try :
@@ -239,7 +266,14 @@ def code_size(opcode):
239266 i += code_size (opcode )
240267
241268
242- def safe_eval (source , globals = None , locals = None ):
269+ def safe_eval (source , globals = None ):
270+
271+ locals = {
272+ "sin" : math .sin ,
273+ "tan" : math .tan ,
274+ "cos" : math .cos ,
275+ "log" : math .log ,
276+ }
243277
244278 code = compile (source , "<safe_eval>" , "eval" )
245279
@@ -248,3 +282,17 @@ def safe_eval(source, globals=None, locals=None):
248282 ans = eval (code , globals , locals )
249283 globals .pop ('__builtins__' ) # 删去副作用
250284 return ans
285+
286+ if __name__ == "__main__" :
287+ constraints = {
288+ "bbbv" : 67 ,
289+ "right" : 8888 ,
290+ "right_s" : 11.9
291+ }
292+ a = safe_eval ("any([min(22+2, 6), 7])" , constraints )
293+ a = safe_eval ("f'{right}@{right_s:.3f}'" , constraints )
294+ a = safe_eval ("sin(22+2) / cos(-50) - (log(7.21))" , constraints )
295+
296+
297+
298+
0 commit comments