diff options
author | RaNaN <Mast3rRaNaN@hotmail.de> | 2010-09-14 20:09:48 +0200 |
---|---|---|
committer | RaNaN <Mast3rRaNaN@hotmail.de> | 2010-09-14 20:09:48 +0200 |
commit | 57130cb3c237dd2b12690afa83c19dfa195234f3 (patch) | |
tree | 176d46a926a6e587fb63cf5ac72c2437b91992a7 /module/SafeEval.py | |
parent | cnl cpu usage fix (diff) | |
download | pyload-57130cb3c237dd2b12690afa83c19dfa195234f3.tar.xz |
typo fix
Diffstat (limited to 'module/SafeEval.py')
-rw-r--r-- | module/SafeEval.py | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/module/SafeEval.py b/module/SafeEval.py new file mode 100644 index 000000000..863ff48cc --- /dev/null +++ b/module/SafeEval.py @@ -0,0 +1,63 @@ +## {{{ http://code.activestate.com/recipes/364469/ (r2) +import compiler + +class Unsafe_Source_Error(Exception): + def __init__(self,error,descr = None,node = None): + self.error = error + self.descr = descr + self.node = node + self.lineno = getattr(node,"lineno",None) + + def __repr__(self): + return "Line %d. %s: %s" % (self.lineno, self.error, self.descr) + __str__ = __repr__ + +class SafeEval(object): + + def visit(self, node,**kw): + cls = node.__class__ + meth = getattr(self,'visit'+cls.__name__,self.default) + return meth(node, **kw) + + def default(self, node, **kw): + for child in node.getChildNodes(): + return self.visit(child, **kw) + + visitExpression = default + + def visitConst(self, node, **kw): + return node.value + + def visitDict(self,node,**kw): + return dict([(self.visit(k),self.visit(v)) for k,v in node.items]) + + def visitTuple(self,node, **kw): + return tuple(self.visit(i) for i in node.nodes) + + def visitList(self,node, **kw): + return [self.visit(i) for i in node.nodes] + +class SafeEvalWithErrors(SafeEval): + + def default(self, node, **kw): + raise Unsafe_Source_Error("Unsupported source construct", + node.__class__,node) + + def visitName(self,node, **kw): + raise Unsafe_Source_Error("Strings must be quoted", + node.name, node) + + # Add more specific errors if desired + + +def safe_eval(source, fail_on_error = True): + walker = fail_on_error and SafeEvalWithErrors() or SafeEval() + try: + ast = compiler.parse(source,"eval") + except SyntaxError, err: + raise + try: + return walker.visit(ast) + except Unsafe_Source_Error, err: + raise +## end of http://code.activestate.com/recipes/364469/ }}} |