micropython: add micropython component
This commit is contained in:
205
components/language/micropython/tests/misc/features.py
Normal file
205
components/language/micropython/tests/misc/features.py
Normal file
@@ -0,0 +1,205 @@
|
||||
try:
|
||||
str.count
|
||||
except AttributeError:
|
||||
print("SKIP")
|
||||
raise SystemExit
|
||||
|
||||
# mad.py
|
||||
# Alf Clement 27-Mar-2014
|
||||
#
|
||||
zero = 0
|
||||
three = 3
|
||||
print("1")
|
||||
print("2")
|
||||
print(three)
|
||||
print("{}".format(4))
|
||||
five = 25 // 5
|
||||
print(int(five))
|
||||
j = 0
|
||||
for i in range(4):
|
||||
j += i
|
||||
print(j)
|
||||
print(3 + 4)
|
||||
try:
|
||||
a = 4 // zero
|
||||
except:
|
||||
print(8)
|
||||
print("xxxxxxxxx".count("x"))
|
||||
|
||||
|
||||
def ten():
|
||||
return 10
|
||||
|
||||
|
||||
print(ten())
|
||||
a = []
|
||||
for i in range(13):
|
||||
a.append(i)
|
||||
print(a[11])
|
||||
print(a[-1])
|
||||
str = "0123456789"
|
||||
print(str[1] + str[3])
|
||||
|
||||
|
||||
def p(s):
|
||||
print(s)
|
||||
|
||||
|
||||
p("14")
|
||||
p(15)
|
||||
|
||||
|
||||
class A:
|
||||
def __init__(self):
|
||||
self.a = 16
|
||||
|
||||
def print(self):
|
||||
print(self.a)
|
||||
|
||||
def set(self, b):
|
||||
self.a = b
|
||||
|
||||
|
||||
a = A()
|
||||
a.print()
|
||||
a.set(17)
|
||||
a.print()
|
||||
b = A()
|
||||
b.set(a.a + 1)
|
||||
b.print()
|
||||
for i in range(20):
|
||||
pass
|
||||
print(i)
|
||||
if 20 > 30:
|
||||
a = "1"
|
||||
else:
|
||||
a = "2"
|
||||
if 0 < 4:
|
||||
print(a + "0")
|
||||
else:
|
||||
print(a + "1")
|
||||
a = [20, 21, 22, 23, 24]
|
||||
for i in a:
|
||||
if i < 21:
|
||||
continue
|
||||
if i > 21:
|
||||
break
|
||||
print(i)
|
||||
b = [a, a, a]
|
||||
print(b[1][2])
|
||||
print(161 // 7)
|
||||
a = 24
|
||||
while True:
|
||||
try:
|
||||
|
||||
def gcheck():
|
||||
global a
|
||||
print(a)
|
||||
|
||||
gcheck()
|
||||
|
||||
class c25:
|
||||
x = 25
|
||||
|
||||
x = c25()
|
||||
print(x.x)
|
||||
raise
|
||||
except:
|
||||
print(26)
|
||||
print(27 + zero)
|
||||
break
|
||||
print(28)
|
||||
k = 29
|
||||
|
||||
|
||||
def f():
|
||||
global k
|
||||
k = yield k
|
||||
|
||||
|
||||
print(next(f()))
|
||||
while True:
|
||||
k += 1
|
||||
if k < 30:
|
||||
continue
|
||||
break
|
||||
print(k)
|
||||
for i in [1, 2, 3]:
|
||||
|
||||
class A:
|
||||
def __init__(self, c):
|
||||
self.a = i + 10 * c
|
||||
|
||||
b = A(3)
|
||||
print(b.a)
|
||||
print(34)
|
||||
p = 0
|
||||
for i in range(35, -1, -1):
|
||||
print(i)
|
||||
p = p + 1
|
||||
if p > 0:
|
||||
break
|
||||
p = 36
|
||||
while p == 36:
|
||||
print(p)
|
||||
p = 37
|
||||
print(p)
|
||||
for i in [38]:
|
||||
print(i)
|
||||
print(int(exec("def foo(): return 38") == None) + foo())
|
||||
d = {}
|
||||
exec("def bar(): return 40", d)
|
||||
print(d["bar"]())
|
||||
|
||||
|
||||
def fib2(n):
|
||||
result = []
|
||||
a, b = 0, 1
|
||||
while a < n:
|
||||
result.append(a)
|
||||
a, b = b, a + b
|
||||
return result
|
||||
|
||||
|
||||
print(fib2(100)[-2] - 14)
|
||||
Answer = {}
|
||||
Answer["ForAll"] = 42
|
||||
print(Answer["ForAll"])
|
||||
i = 43
|
||||
|
||||
|
||||
def f(i=i):
|
||||
print(i)
|
||||
|
||||
|
||||
i = 44
|
||||
f()
|
||||
print(i)
|
||||
while True:
|
||||
try:
|
||||
if None != True:
|
||||
print(45)
|
||||
break
|
||||
else:
|
||||
print(0)
|
||||
except:
|
||||
print(0)
|
||||
print(46)
|
||||
print(46 + 1)
|
||||
|
||||
|
||||
def u(p):
|
||||
if p > 3:
|
||||
return 3 * p
|
||||
else:
|
||||
return u(2 * p) - 3 * u(p)
|
||||
|
||||
|
||||
print(u(16))
|
||||
|
||||
|
||||
def u49():
|
||||
return 49
|
||||
|
||||
|
||||
print(u49())
|
161
components/language/micropython/tests/misc/non_compliant.py
Normal file
161
components/language/micropython/tests/misc/non_compliant.py
Normal file
@@ -0,0 +1,161 @@
|
||||
# tests for things that are not implemented, or have non-compliant behaviour
|
||||
|
||||
try:
|
||||
import uarray as array
|
||||
import ustruct
|
||||
except ImportError:
|
||||
print("SKIP")
|
||||
raise SystemExit
|
||||
|
||||
# when super can't find self
|
||||
try:
|
||||
exec("def f(): super()")
|
||||
except SyntaxError:
|
||||
print("SyntaxError")
|
||||
|
||||
# store to exception attribute is not allowed
|
||||
try:
|
||||
ValueError().x = 0
|
||||
except AttributeError:
|
||||
print("AttributeError")
|
||||
|
||||
# array deletion not implemented
|
||||
try:
|
||||
a = array.array("b", (1, 2, 3))
|
||||
del a[1]
|
||||
except TypeError:
|
||||
print("TypeError")
|
||||
|
||||
# slice with step!=1 not implemented
|
||||
try:
|
||||
a = array.array("b", (1, 2, 3))
|
||||
print(a[3:2:2])
|
||||
except NotImplementedError:
|
||||
print("NotImplementedError")
|
||||
|
||||
# containment, looking for integer not implemented
|
||||
try:
|
||||
print(1 in array.array("B", b"12"))
|
||||
except NotImplementedError:
|
||||
print("NotImplementedError")
|
||||
|
||||
# uPy raises TypeError, shold be ValueError
|
||||
try:
|
||||
"%c" % b"\x01\x02"
|
||||
except (TypeError, ValueError):
|
||||
print("TypeError, ValueError")
|
||||
|
||||
# attributes/subscr not implemented
|
||||
try:
|
||||
print("{a[0]}".format(a=[1, 2]))
|
||||
except NotImplementedError:
|
||||
print("NotImplementedError")
|
||||
|
||||
# str(...) with keywords not implemented
|
||||
try:
|
||||
str(b"abc", encoding="utf8")
|
||||
except NotImplementedError:
|
||||
print("NotImplementedError")
|
||||
|
||||
# str.rsplit(None, n) not implemented
|
||||
try:
|
||||
"a a a".rsplit(None, 1)
|
||||
except NotImplementedError:
|
||||
print("NotImplementedError")
|
||||
|
||||
# str.endswith(s, start) not implemented
|
||||
try:
|
||||
"abc".endswith("c", 1)
|
||||
except NotImplementedError:
|
||||
print("NotImplementedError")
|
||||
|
||||
# str subscr with step!=1 not implemented
|
||||
try:
|
||||
print("abc"[1:2:3])
|
||||
except NotImplementedError:
|
||||
print("NotImplementedError")
|
||||
|
||||
# bytes(...) with keywords not implemented
|
||||
try:
|
||||
bytes("abc", encoding="utf8")
|
||||
except NotImplementedError:
|
||||
print("NotImplementedError")
|
||||
|
||||
# bytes subscr with step!=1 not implemented
|
||||
try:
|
||||
b"123"[0:3:2]
|
||||
except NotImplementedError:
|
||||
print("NotImplementedError")
|
||||
|
||||
# tuple load with step!=1 not implemented
|
||||
try:
|
||||
()[2:3:4]
|
||||
except NotImplementedError:
|
||||
print("NotImplementedError")
|
||||
|
||||
# list store with step!=1 not implemented
|
||||
try:
|
||||
[][2:3:4] = []
|
||||
except NotImplementedError:
|
||||
print("NotImplementedError")
|
||||
|
||||
# list delete with step!=1 not implemented
|
||||
try:
|
||||
del [][2:3:4]
|
||||
except NotImplementedError:
|
||||
print("NotImplementedError")
|
||||
|
||||
# struct pack with too many args, not checked by uPy
|
||||
print(ustruct.pack("bb", 1, 2, 3))
|
||||
|
||||
# struct pack with too few args, not checked by uPy
|
||||
print(ustruct.pack("bb", 1))
|
||||
|
||||
# array slice assignment with unsupported RHS
|
||||
try:
|
||||
bytearray(4)[0:1] = [1, 2]
|
||||
except NotImplementedError:
|
||||
print("NotImplementedError")
|
||||
|
||||
# can't assign attributes to a function
|
||||
def f():
|
||||
pass
|
||||
|
||||
|
||||
try:
|
||||
f.x = 1
|
||||
except AttributeError:
|
||||
print("AttributeError")
|
||||
|
||||
# can't call a function type (ie make new instances of a function)
|
||||
try:
|
||||
type(f)()
|
||||
except TypeError:
|
||||
print("TypeError")
|
||||
|
||||
# test when object explicitly listed at not-last position in parent tuple
|
||||
# this is not compliant with CPython because of illegal MRO
|
||||
class A:
|
||||
def foo(self):
|
||||
print("A.foo")
|
||||
|
||||
|
||||
class B(object, A):
|
||||
pass
|
||||
|
||||
|
||||
B().foo()
|
||||
|
||||
# can't assign property (or other special accessors) to already-subclassed class
|
||||
class A:
|
||||
pass
|
||||
|
||||
|
||||
class B(A):
|
||||
pass
|
||||
|
||||
|
||||
try:
|
||||
A.bar = property()
|
||||
except AttributeError:
|
||||
print("AttributeError")
|
@@ -0,0 +1,23 @@
|
||||
SyntaxError
|
||||
AttributeError
|
||||
TypeError
|
||||
NotImplementedError
|
||||
NotImplementedError
|
||||
TypeError, ValueError
|
||||
NotImplementedError
|
||||
NotImplementedError
|
||||
NotImplementedError
|
||||
NotImplementedError
|
||||
NotImplementedError
|
||||
NotImplementedError
|
||||
NotImplementedError
|
||||
NotImplementedError
|
||||
NotImplementedError
|
||||
NotImplementedError
|
||||
b'\x01\x02'
|
||||
b'\x01\x00'
|
||||
NotImplementedError
|
||||
AttributeError
|
||||
TypeError
|
||||
A.foo
|
||||
AttributeError
|
@@ -0,0 +1,33 @@
|
||||
# lexer tests for things that are not implemented, or have non-compliant behaviour
|
||||
|
||||
|
||||
def test(code):
|
||||
try:
|
||||
exec(code)
|
||||
print("no Error")
|
||||
except SyntaxError:
|
||||
print("SyntaxError")
|
||||
except NotImplementedError:
|
||||
print("NotImplementedError")
|
||||
|
||||
|
||||
# uPy requires spaces between literal numbers and keywords, CPy doesn't
|
||||
try:
|
||||
eval("1and 0")
|
||||
except SyntaxError:
|
||||
print("SyntaxError")
|
||||
try:
|
||||
eval("1or 0")
|
||||
except SyntaxError:
|
||||
print("SyntaxError")
|
||||
try:
|
||||
eval("1if 1else 0")
|
||||
except SyntaxError:
|
||||
print("SyntaxError")
|
||||
try:
|
||||
eval("1if 0else 0")
|
||||
except SyntaxError:
|
||||
print("SyntaxError")
|
||||
|
||||
# unicode name escapes are not implemented
|
||||
test('"\\N{LATIN SMALL LETTER A}"')
|
@@ -0,0 +1,5 @@
|
||||
SyntaxError
|
||||
SyntaxError
|
||||
SyntaxError
|
||||
SyntaxError
|
||||
NotImplementedError
|
@@ -0,0 +1,99 @@
|
||||
try:
|
||||
try:
|
||||
import uio as io
|
||||
import usys as sys
|
||||
except ImportError:
|
||||
import io
|
||||
import sys
|
||||
except ImportError:
|
||||
print("SKIP")
|
||||
raise SystemExit
|
||||
|
||||
if hasattr(sys, "print_exception"):
|
||||
print_exception = sys.print_exception
|
||||
else:
|
||||
import traceback
|
||||
|
||||
print_exception = lambda e, f: traceback.print_exception(None, e, sys.exc_info()[2], file=f)
|
||||
|
||||
|
||||
def print_exc(e):
|
||||
buf = io.StringIO()
|
||||
print_exception(e, buf)
|
||||
s = buf.getvalue()
|
||||
for l in s.split("\n"):
|
||||
# uPy on pyboard prints <stdin> as file, so remove filename.
|
||||
if l.startswith(" File "):
|
||||
l = l.split('"')
|
||||
print(l[0], l[2])
|
||||
# uPy and CPy tracebacks differ in that CPy prints a source line for
|
||||
# each traceback entry. In this case, we know that offending line
|
||||
# has 4-space indent, so filter it out.
|
||||
elif not l.startswith(" "):
|
||||
print(l)
|
||||
|
||||
|
||||
# basic exception message
|
||||
try:
|
||||
raise Exception("msg")
|
||||
except Exception as e:
|
||||
print("caught")
|
||||
print_exc(e)
|
||||
|
||||
# exception message with more than 1 source-code line
|
||||
def f():
|
||||
g()
|
||||
|
||||
|
||||
def g():
|
||||
raise Exception("fail")
|
||||
|
||||
|
||||
try:
|
||||
f()
|
||||
except Exception as e:
|
||||
print("caught")
|
||||
print_exc(e)
|
||||
|
||||
# Test that an exception propagated through a finally doesn't have a traceback added there
|
||||
try:
|
||||
try:
|
||||
f()
|
||||
finally:
|
||||
print("finally")
|
||||
except Exception as e:
|
||||
print("caught")
|
||||
print_exc(e)
|
||||
|
||||
# Test that re-raising an exception doesn't add traceback info
|
||||
try:
|
||||
try:
|
||||
f()
|
||||
except Exception as e:
|
||||
print("reraise")
|
||||
print_exc(e)
|
||||
raise
|
||||
except Exception as e:
|
||||
print("caught")
|
||||
print_exc(e)
|
||||
|
||||
# Here we have a function with lots of bytecode generated for a single source-line, and
|
||||
# there is an error right at the end of the bytecode. It should report the correct line.
|
||||
def f():
|
||||
f([1, 2], [1, 2], [1, 2], {1: 1, 1: 1, 1: 1, 1: 1, 1: 1, 1: 1, 1: f.X})
|
||||
return 1
|
||||
|
||||
|
||||
try:
|
||||
f()
|
||||
except Exception as e:
|
||||
print_exc(e)
|
||||
|
||||
# Test non-stream object passed as output object, only valid for uPy
|
||||
if hasattr(sys, "print_exception"):
|
||||
try:
|
||||
sys.print_exception(Exception, 1)
|
||||
had_exception = False
|
||||
except OSError:
|
||||
had_exception = True
|
||||
assert had_exception
|
141
components/language/micropython/tests/misc/rge_sm.py
Normal file
141
components/language/micropython/tests/misc/rge_sm.py
Normal file
@@ -0,0 +1,141 @@
|
||||
# evolve the RGEs of the standard model from electroweak scale up
|
||||
# by dpgeorge
|
||||
|
||||
import math
|
||||
|
||||
|
||||
class RungeKutta(object):
|
||||
def __init__(self, functions, initConditions, t0, dh, save=True):
|
||||
self.Trajectory, self.save = [[t0] + initConditions], save
|
||||
self.functions = [lambda *args: 1.0] + list(functions)
|
||||
self.N, self.dh = len(self.functions), dh
|
||||
self.coeff = [1.0 / 6.0, 2.0 / 6.0, 2.0 / 6.0, 1.0 / 6.0]
|
||||
self.InArgCoeff = [0.0, 0.5, 0.5, 1.0]
|
||||
|
||||
def iterate(self):
|
||||
step = self.Trajectory[-1][:]
|
||||
istep, iac = step[:], self.InArgCoeff
|
||||
k, ktmp = self.N * [0.0], self.N * [0.0]
|
||||
for ic, c in enumerate(self.coeff):
|
||||
for if_, f in enumerate(self.functions):
|
||||
arguments = [(x + k[i] * iac[ic]) for i, x in enumerate(istep)]
|
||||
try:
|
||||
feval = f(*arguments)
|
||||
except OverflowError:
|
||||
return False
|
||||
if abs(feval) > 1e2: # stop integrating
|
||||
return False
|
||||
ktmp[if_] = self.dh * feval
|
||||
k = ktmp[:]
|
||||
step = [s + c * k[ik] for ik, s in enumerate(step)]
|
||||
if self.save:
|
||||
self.Trajectory += [step]
|
||||
else:
|
||||
self.Trajectory = [step]
|
||||
return True
|
||||
|
||||
def solve(self, finishtime):
|
||||
while self.Trajectory[-1][0] < finishtime:
|
||||
if not self.iterate():
|
||||
break
|
||||
|
||||
def solveNSteps(self, nSteps):
|
||||
for i in range(nSteps):
|
||||
if not self.iterate():
|
||||
break
|
||||
|
||||
def series(self):
|
||||
return zip(*self.Trajectory)
|
||||
|
||||
|
||||
# 1-loop RGES for the main parameters of the SM
|
||||
# couplings are: g1, g2, g3 of U(1), SU(2), SU(3); yt (top Yukawa), lambda (Higgs quartic)
|
||||
# see arxiv.org/abs/0812.4950, eqs 10-15
|
||||
sysSM = (
|
||||
lambda *a: 41.0 / 96.0 / math.pi**2 * a[1] ** 3, # g1
|
||||
lambda *a: -19.0 / 96.0 / math.pi**2 * a[2] ** 3, # g2
|
||||
lambda *a: -42.0 / 96.0 / math.pi**2 * a[3] ** 3, # g3
|
||||
lambda *a: 1.0
|
||||
/ 16.0
|
||||
/ math.pi**2
|
||||
* (
|
||||
9.0 / 2.0 * a[4] ** 3
|
||||
- 8.0 * a[3] ** 2 * a[4]
|
||||
- 9.0 / 4.0 * a[2] ** 2 * a[4]
|
||||
- 17.0 / 12.0 * a[1] ** 2 * a[4]
|
||||
), # yt
|
||||
lambda *a: 1.0
|
||||
/ 16.0
|
||||
/ math.pi**2
|
||||
* (
|
||||
24.0 * a[5] ** 2
|
||||
+ 12.0 * a[4] ** 2 * a[5]
|
||||
- 9.0 * a[5] * (a[2] ** 2 + 1.0 / 3.0 * a[1] ** 2)
|
||||
- 6.0 * a[4] ** 4
|
||||
+ 9.0 / 8.0 * a[2] ** 4
|
||||
+ 3.0 / 8.0 * a[1] ** 4
|
||||
+ 3.0 / 4.0 * a[2] ** 2 * a[1] ** 2
|
||||
), # lambda
|
||||
)
|
||||
|
||||
|
||||
def drange(start, stop, step):
|
||||
r = start
|
||||
while r < stop:
|
||||
yield r
|
||||
r += step
|
||||
|
||||
|
||||
def phaseDiagram(system, trajStart, trajPlot, h=0.1, tend=1.0, range=1.0):
|
||||
tstart = 0.0
|
||||
for i in drange(0, range, 0.1 * range):
|
||||
for j in drange(0, range, 0.1 * range):
|
||||
rk = RungeKutta(system, trajStart(i, j), tstart, h)
|
||||
rk.solve(tend)
|
||||
# draw the line
|
||||
for tr in rk.Trajectory:
|
||||
x, y = trajPlot(tr)
|
||||
print(x, y)
|
||||
print()
|
||||
# draw the arrow
|
||||
continue
|
||||
l = (len(rk.Trajectory) - 1) / 3
|
||||
if l > 0 and 2 * l < len(rk.Trajectory):
|
||||
p1 = rk.Trajectory[l]
|
||||
p2 = rk.Trajectory[2 * l]
|
||||
x1, y1 = trajPlot(p1)
|
||||
x2, y2 = trajPlot(p2)
|
||||
dx = -0.5 * (y2 - y1) # orthogonal to line
|
||||
dy = 0.5 * (x2 - x1) # orthogonal to line
|
||||
# l = math.sqrt(dx*dx + dy*dy)
|
||||
# if abs(l) > 1e-3:
|
||||
# l = 0.1 / l
|
||||
# dx *= l
|
||||
# dy *= l
|
||||
print(x1 + dx, y1 + dy)
|
||||
print(x2, y2)
|
||||
print(x1 - dx, y1 - dy)
|
||||
print()
|
||||
|
||||
|
||||
def singleTraj(system, trajStart, h=0.02, tend=1.0):
|
||||
tstart = 0.0
|
||||
|
||||
# compute the trajectory
|
||||
|
||||
rk = RungeKutta(system, trajStart, tstart, h)
|
||||
rk.solve(tend)
|
||||
|
||||
# print out trajectory
|
||||
|
||||
for i in range(len(rk.Trajectory)):
|
||||
tr = rk.Trajectory[i]
|
||||
print(" ".join(["{:.4f}".format(t) for t in tr]))
|
||||
|
||||
|
||||
# phaseDiagram(sysSM, (lambda i, j: [0.354, 0.654, 1.278, 0.8 + 0.2 * i, 0.1 + 0.1 * j]), (lambda a: (a[4], a[5])), h=0.1, tend=math.log(10**17))
|
||||
|
||||
# initial conditions at M_Z
|
||||
singleTraj(
|
||||
sysSM, [0.354, 0.654, 1.278, 0.983, 0.131], h=0.5, tend=math.log(10**17)
|
||||
) # true values
|
21
components/language/micropython/tests/misc/sys_atexit.py
Normal file
21
components/language/micropython/tests/misc/sys_atexit.py
Normal file
@@ -0,0 +1,21 @@
|
||||
# test sys.atexit() function
|
||||
|
||||
import usys
|
||||
|
||||
try:
|
||||
usys.atexit
|
||||
except AttributeError:
|
||||
print("SKIP")
|
||||
raise SystemExit
|
||||
|
||||
some_var = None
|
||||
|
||||
|
||||
def do_at_exit():
|
||||
print("done at exit:", some_var)
|
||||
|
||||
|
||||
usys.atexit(do_at_exit)
|
||||
|
||||
some_var = "ok"
|
||||
print("done before exit")
|
@@ -0,0 +1,2 @@
|
||||
done before exit
|
||||
done at exit: ok
|
27
components/language/micropython/tests/misc/sys_exc_info.py
Normal file
27
components/language/micropython/tests/misc/sys_exc_info.py
Normal file
@@ -0,0 +1,27 @@
|
||||
try:
|
||||
import usys as sys
|
||||
except ImportError:
|
||||
import sys
|
||||
|
||||
try:
|
||||
sys.exc_info
|
||||
except:
|
||||
print("SKIP")
|
||||
raise SystemExit
|
||||
|
||||
|
||||
def f():
|
||||
print(sys.exc_info()[0:2])
|
||||
|
||||
|
||||
try:
|
||||
raise ValueError("value", 123)
|
||||
except:
|
||||
print(sys.exc_info()[0:2])
|
||||
f()
|
||||
|
||||
# Outside except block, sys.exc_info() should be back to None's
|
||||
f()
|
||||
|
||||
# Recursive except blocks are not handled - just don't
|
||||
# use exc_info() at all, use explicit variables in "except".
|
@@ -0,0 +1,110 @@
|
||||
import sys
|
||||
|
||||
try:
|
||||
sys.settrace
|
||||
except AttributeError:
|
||||
print("SKIP")
|
||||
raise SystemExit
|
||||
|
||||
|
||||
def print_stacktrace(frame, level=0):
|
||||
# Ignore CPython specific helpers.
|
||||
if frame.f_globals["__name__"].find("importlib") != -1:
|
||||
print_stacktrace(frame.f_back, level)
|
||||
return
|
||||
|
||||
print(
|
||||
"%2d: %s@%s:%s => %s:%d"
|
||||
% (
|
||||
level,
|
||||
" ",
|
||||
frame.f_globals["__name__"],
|
||||
frame.f_code.co_name,
|
||||
# Keep just the filename.
|
||||
"sys_settrace_" + frame.f_code.co_filename.split("sys_settrace_")[-1],
|
||||
frame.f_lineno,
|
||||
)
|
||||
)
|
||||
|
||||
if frame.f_back:
|
||||
print_stacktrace(frame.f_back, level + 1)
|
||||
|
||||
|
||||
class _Prof:
|
||||
trace_count = 0
|
||||
|
||||
def trace_tick(self, frame, event, arg):
|
||||
self.trace_count += 1
|
||||
print_stacktrace(frame)
|
||||
|
||||
|
||||
__prof__ = _Prof()
|
||||
|
||||
alice_handler_set = False
|
||||
|
||||
|
||||
def trace_tick_handler_alice(frame, event, arg):
|
||||
print("### trace_handler::Alice event:", event)
|
||||
__prof__.trace_tick(frame, event, arg)
|
||||
return trace_tick_handler_alice
|
||||
|
||||
|
||||
bob_handler_set = False
|
||||
|
||||
|
||||
def trace_tick_handler_bob(frame, event, arg):
|
||||
print("### trace_handler::Bob event:", event)
|
||||
__prof__.trace_tick(frame, event, arg)
|
||||
return trace_tick_handler_bob
|
||||
|
||||
|
||||
def trace_tick_handler(frame, event, arg):
|
||||
# Ignore CPython specific helpers.
|
||||
to_ignore = ["importlib", "zipimport", "encodings"]
|
||||
frame_name = frame.f_globals["__name__"]
|
||||
if any(name in frame_name for name in to_ignore):
|
||||
return
|
||||
|
||||
print("### trace_handler::main event:", event)
|
||||
__prof__.trace_tick(frame, event, arg)
|
||||
|
||||
if frame.f_code.co_name != "factorial":
|
||||
return trace_tick_handler
|
||||
|
||||
global alice_handler_set
|
||||
if event == "call" and not alice_handler_set:
|
||||
alice_handler_set = True
|
||||
return trace_tick_handler_alice
|
||||
|
||||
global bob_handler_set
|
||||
if event == "call" and not bob_handler_set:
|
||||
bob_handler_set = True
|
||||
return trace_tick_handler_bob
|
||||
|
||||
return trace_tick_handler
|
||||
|
||||
|
||||
def factorial(n):
|
||||
if n == 0:
|
||||
return 1
|
||||
else:
|
||||
return n * factorial(n - 1)
|
||||
|
||||
|
||||
def do_tests():
|
||||
# These commands are here to demonstrate some execution being traced.
|
||||
print("Who loves the sun?")
|
||||
print("Not every-", factorial(3))
|
||||
|
||||
from sys_settrace_subdir import sys_settrace_generic
|
||||
|
||||
sys_settrace_generic.run_tests()
|
||||
return
|
||||
|
||||
|
||||
sys.settrace(trace_tick_handler)
|
||||
do_tests()
|
||||
sys.settrace(None)
|
||||
|
||||
print("\n------------------ script exited ------------------")
|
||||
print("Total traces executed: ", __prof__.trace_count)
|
@@ -0,0 +1,71 @@
|
||||
# test sys.settrace with generators
|
||||
|
||||
import sys
|
||||
|
||||
try:
|
||||
sys.settrace
|
||||
except AttributeError:
|
||||
print("SKIP")
|
||||
raise SystemExit
|
||||
|
||||
|
||||
def print_stacktrace(frame, level=0):
|
||||
print(
|
||||
"%2d: %s@%s:%s => %s:%d"
|
||||
% (
|
||||
level,
|
||||
" ",
|
||||
frame.f_globals["__name__"],
|
||||
frame.f_code.co_name,
|
||||
# Keep just the filename.
|
||||
"sys_settrace_" + frame.f_code.co_filename.split("sys_settrace_")[-1],
|
||||
frame.f_lineno,
|
||||
)
|
||||
)
|
||||
|
||||
if frame.f_back:
|
||||
print_stacktrace(frame.f_back, level + 1)
|
||||
|
||||
|
||||
trace_count = 0
|
||||
|
||||
|
||||
def trace_tick_handler(frame, event, arg):
|
||||
global trace_count
|
||||
print("### trace_handler::main event:", event)
|
||||
trace_count += 1
|
||||
print_stacktrace(frame)
|
||||
return trace_tick_handler
|
||||
|
||||
|
||||
def test_generator():
|
||||
def make_gen():
|
||||
yield 1 << 0
|
||||
yield 1 << 1
|
||||
yield 1 << 2
|
||||
return 1 << 3
|
||||
|
||||
gen = make_gen()
|
||||
r = 0
|
||||
try:
|
||||
|
||||
r += gen.send(None)
|
||||
|
||||
while True:
|
||||
|
||||
r += gen.send(None)
|
||||
|
||||
except StopIteration as e:
|
||||
print("test_generator", r, e)
|
||||
|
||||
gen = make_gen()
|
||||
r = 0
|
||||
for i in gen:
|
||||
r += i
|
||||
print(r)
|
||||
|
||||
|
||||
sys.settrace(trace_tick_handler)
|
||||
test_generator()
|
||||
sys.settrace(None)
|
||||
print("Total traces executed: ", trace_count)
|
@@ -0,0 +1,195 @@
|
||||
### trace_handler::main event: call
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:41
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:42
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:48
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:49
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:50
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:52
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: call
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:42
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:52
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:43
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:52
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: return
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:43
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:52
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:56
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: call
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:43
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:56
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:43
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:56
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:44
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:56
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: return
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:44
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:56
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: call
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:44
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:56
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:44
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:56
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:45
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:56
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: return
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:45
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:56
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: call
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:45
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:56
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:45
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:56
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:46
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:56
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: return
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:46
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:56
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: exception
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:56
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:58
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:59
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
test_generator 7 8
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:61
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:62
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: call
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:42
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:43
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: return
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:43
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:64
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: call
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:43
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:43
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:44
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: return
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:44
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:64
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: call
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:44
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:44
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:45
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: return
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:45
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:64
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: call
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:45
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:45
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:46
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: return
|
||||
0: @__main__:make_gen => sys_settrace_generator.py:46
|
||||
1: @__main__:test_generator => sys_settrace_generator.py:63
|
||||
2: @__main__:<module> => sys_settrace_generator.py:69
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:65
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
7
|
||||
### trace_handler::main event: return
|
||||
0: @__main__:test_generator => sys_settrace_generator.py:65
|
||||
1: @__main__:<module> => sys_settrace_generator.py:69
|
||||
Total traces executed: 54
|
@@ -0,0 +1,60 @@
|
||||
# test sys.settrace with while and for loops
|
||||
|
||||
import sys
|
||||
|
||||
try:
|
||||
sys.settrace
|
||||
except AttributeError:
|
||||
print("SKIP")
|
||||
raise SystemExit
|
||||
|
||||
|
||||
def print_stacktrace(frame, level=0):
|
||||
print(
|
||||
"%2d: %s@%s:%s => %s:%d"
|
||||
% (
|
||||
level,
|
||||
" ",
|
||||
frame.f_globals["__name__"],
|
||||
frame.f_code.co_name,
|
||||
# Keep just the filename.
|
||||
"sys_settrace_" + frame.f_code.co_filename.split("sys_settrace_")[-1],
|
||||
frame.f_lineno,
|
||||
)
|
||||
)
|
||||
|
||||
if frame.f_back:
|
||||
print_stacktrace(frame.f_back, level + 1)
|
||||
|
||||
|
||||
trace_count = 0
|
||||
|
||||
|
||||
def trace_tick_handler(frame, event, arg):
|
||||
global trace_count
|
||||
print("### trace_handler::main event:", event)
|
||||
trace_count += 1
|
||||
print_stacktrace(frame)
|
||||
return trace_tick_handler
|
||||
|
||||
|
||||
def test_loop():
|
||||
# for loop
|
||||
r = 0
|
||||
for i in range(3):
|
||||
r += i
|
||||
print("test_for_loop", r)
|
||||
|
||||
# while loop
|
||||
r = 0
|
||||
i = 0
|
||||
while i < 3:
|
||||
r += i
|
||||
i += 1
|
||||
print("test_while_loop", i)
|
||||
|
||||
|
||||
sys.settrace(trace_tick_handler)
|
||||
test_loop()
|
||||
sys.settrace(None)
|
||||
print("Total traces executed: ", trace_count)
|
@@ -0,0 +1,72 @@
|
||||
### trace_handler::main event: call
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:41
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:43
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:44
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:45
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:44
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:45
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:44
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:45
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:44
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:45
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:46
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
test_for_loop 3
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:49
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:50
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:51
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:53
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:52
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:53
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:52
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:53
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:52
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:53
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
### trace_handler::main event: line
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:54
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
test_while_loop 3
|
||||
### trace_handler::main event: return
|
||||
0: @__main__:test_loop => sys_settrace_loop.py:54
|
||||
1: @__main__:<module> => sys_settrace_loop.py:58
|
||||
Total traces executed: 23
|
@@ -0,0 +1,92 @@
|
||||
print("Now comes the language constructions tests.")
|
||||
|
||||
# function
|
||||
def test_func():
|
||||
def test_sub_func():
|
||||
print("test_function")
|
||||
|
||||
test_sub_func()
|
||||
|
||||
|
||||
# closure
|
||||
def test_closure(msg):
|
||||
def make_closure():
|
||||
print(msg)
|
||||
|
||||
return make_closure
|
||||
|
||||
|
||||
# exception
|
||||
def test_exception():
|
||||
try:
|
||||
raise Exception("test_exception")
|
||||
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
finally:
|
||||
pass
|
||||
|
||||
|
||||
# listcomp
|
||||
def test_listcomp():
|
||||
print("test_listcomp", [x for x in range(3)])
|
||||
|
||||
|
||||
# lambda
|
||||
def test_lambda():
|
||||
func_obj_1 = lambda a, b: a + b
|
||||
print(func_obj_1(10, 20))
|
||||
|
||||
|
||||
# import
|
||||
def test_import():
|
||||
from sys_settrace_subdir import sys_settrace_importme
|
||||
|
||||
sys_settrace_importme.dummy()
|
||||
sys_settrace_importme.saysomething()
|
||||
|
||||
|
||||
# class
|
||||
class TLClass:
|
||||
def method():
|
||||
pass
|
||||
|
||||
pass
|
||||
|
||||
|
||||
def test_class():
|
||||
class TestClass:
|
||||
__anynum = -9
|
||||
|
||||
def method(self):
|
||||
print("test_class_method")
|
||||
self.__anynum += 1
|
||||
|
||||
def prprty_getter(self):
|
||||
return self.__anynum
|
||||
|
||||
def prprty_setter(self, what):
|
||||
self.__anynum = what
|
||||
|
||||
prprty = property(prprty_getter, prprty_setter)
|
||||
|
||||
cls = TestClass()
|
||||
cls.method()
|
||||
print("test_class_property", cls.prprty)
|
||||
cls.prprty = 12
|
||||
print("test_class_property", cls.prprty)
|
||||
|
||||
|
||||
def run_tests():
|
||||
test_func()
|
||||
test_closure_inst = test_closure("test_closure")
|
||||
test_closure_inst()
|
||||
test_exception()
|
||||
test_listcomp()
|
||||
test_lambda()
|
||||
test_class()
|
||||
test_import()
|
||||
|
||||
|
||||
print("And it's done!")
|
@@ -0,0 +1,28 @@
|
||||
print("Yep, I got imported.")
|
||||
|
||||
try:
|
||||
x = const(1)
|
||||
except NameError:
|
||||
print("const not defined")
|
||||
|
||||
const = lambda x: x
|
||||
|
||||
_CNT01 = "CONST01"
|
||||
_CNT02 = const(123)
|
||||
A123 = const(123)
|
||||
a123 = const(123)
|
||||
|
||||
|
||||
def dummy():
|
||||
return False
|
||||
|
||||
|
||||
def saysomething():
|
||||
print("There, I said it.")
|
||||
|
||||
|
||||
def neverexecuted():
|
||||
print("Never got here!")
|
||||
|
||||
|
||||
print("Yep, got here")
|
Reference in New Issue
Block a user