/usr/share/pyshared/epsilon/unrepr.py is in python-epsilon 0.6.0+r2713-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 | import compiler
def unrepr(s):
"""
Convert a string produced by python's repr() into the
corresponding data structure, without calling eval().
"""
return Builder().build(getObj(s))
def getObj(s):
s="a="+s
return compiler.parse(s).getChildren()[1].getChildren()[0].getChildren()[1]
class UnknownType(Exception):
pass
class Builder:
def build(self, o):
m = getattr(self, 'build_'+o.__class__.__name__, None)
if m is None:
raise UnknownType(o.__class__.__name__)
return m(o)
def build_List(self, o):
return map(self.build, o.getChildren())
def build_Const(self, o):
return o.value
def build_Dict(self, o):
d = {}
i = iter(map(self.build, o.getChildren()))
for el in i:
d[el] = i.next()
return d
def build_Tuple(self, o):
return tuple(self.build_List(o))
def build_Name(self, o):
if o.name == 'None':
return None
raise UnknownType('Name')
def build_Add(self, o):
real, imag = map(self.build_Const, o.getChildren())
try:
real = float(real)
except TypeError:
raise UnknownType('Add')
if not isinstance(imag, complex) or imag.real != 0.0:
raise UnknownType('Add')
return real+imag
|