/usr/share/pyshared/guppy/etc/Unpack.py is in python-guppy 0.1.9-2ubuntu4.
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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | #._cv_part guppy.etc.Unpack
from opcode import *
import sys
CALL_FUNCTION = opmap['CALL_FUNCTION']
UNPACK_SEQUENCE = opmap['UNPACK_SEQUENCE']
STORE_FAST = opmap['STORE_FAST']
STORE_NAME = opmap['STORE_NAME']
STORE_GLOBAL = opmap['STORE_GLOBAL']
STORE_ATTR = opmap['STORE_ATTR']
STORE_SUBSCR = opmap['STORE_SUBSCR']
STORE_SLICE = opmap['STORE_SLICE+0']
def unpack(x):
try:
1/0
except:
typ, value, traceback = sys.exc_info()
f = traceback.tb_frame.f_back
co = f.f_code
i = f.f_lasti
code = co.co_code
if ord(code[i]) == CALL_FUNCTION and ord(code[i+3]) == UNPACK_SEQUENCE:
i += 3
n = ord(code[i+1]) + ord(code[i+2])*256
i += 3
names = []
while len(names) < n and i < len(code):
op = ord(code[i])
i += 1
if op >= HAVE_ARGUMENT:
oparg = ord(code[i]) + ord(code[i+1])*256
i += 2
if op == STORE_FAST:
names.append(co.co_varnames[oparg])
elif op in (STORE_NAME, STORE_ATTR, STORE_GLOBAL):
names.append(co.co_names[oparg])
if op == STORE_SUBSCR or STORE_SLICE <= op <= STORE_SLICE+3:
break
if len(names) == n:
r = []
for name in names:
try:
v = getattr(x, name)
except AttributeError:
v = x[name]
r.append(v)
return r
raise SyntaxError
def test_unpack():
class C:
a=1
b=3
c=4
y = C()
a, b, c = unpack(y)
x = [a,b,c]
class D:
pass
D.a, c, D.b = unpack(y)
x.extend([D.a, c, D.b])
l=[None]
try:
l[0], c, b = unpack(y)
except SyntaxError:
pass
else:
raise RuntimeError
l=[None]
try:
l[1:2], c, b = unpack(y)
except SyntaxError:
pass
else:
raise RuntimeError
y=[]
y = {'a':'A', 'b':'B'}
a, b = unpack(y)
x.extend([a, b])
global g
y['g']='G'
g, b = unpack(y)
x.extend([g, b])
if x != [1, 3, 4, 1, 4, 3, 'A', 'B', 'G', 'B']:
raise RuntimeError
__all__ = 'unpack'
if __name__ == '__main__':
test_unpack()
|