def test_sub(self):
node = ast.parse("31 - 57")
self.assertEqual("(31 - 57)", self.fc.visit(node))
node = ast.parse("31 - (+57)")
self.assertEqual("(31 - (+57))", self.fc.visit(node))
node = ast.parse("31 - x")
self.assertEqual("(31 - x)", self.fc.visit(node))
node = ast.parse("y - 57")
self.assertEqual("(y - 57)", self.fc.visit(node))
node = ast.parse("x - y")
self.assertEqual("(x - y)", self.fc.visit(node))
node = ast.parse("x - y - z")
self.assertEqual("((x - y) - z)", self.fc.visit(node))
node = ast.parse("x.i - y.i")
self.assertEqual("(x.i - y.i)", self.fc.visit(node))
node = ast.parse("x.a_method(a) - y.a_method(b)")
self.assertEqual("(x.a_method(a) - y.a_method(b))", self.fc.visit(node))
python类parse()的实例源码
def test_floordiv(self):
node = ast.parse("31 // 57")
self.assertEqual("int(31 / 57)", self.fc.visit(node))
node = ast.parse("31 // (-57)")
self.assertEqual("int(31 / (-57))", self.fc.visit(node))
node = ast.parse("31 // x")
self.assertEqual("int(31 / x)", self.fc.visit(node))
node = ast.parse("y // 57")
self.assertEqual("int(y / 57)", self.fc.visit(node))
node = ast.parse("x // y")
self.assertEqual("int(x / y)", self.fc.visit(node))
node = ast.parse("x.i // y.i")
self.assertEqual("int(x.i / y.i)", self.fc.visit(node))
node = ast.parse("x // y // z")
self.assertEqual("int(int(x / y) / z)", self.fc.visit(node))
node = ast.parse("x.a_method(a) // y.a_method(b)")
self.assertEqual("int(x.a_method(a) / y.a_method(b))", self.fc.visit(node))
def test_modulo(self):
node = ast.parse("31 % 57")
self.assertEqual("(31 % 57)", self.fc.visit(node))
node = ast.parse("31 % (-57)")
self.assertEqual("(31 % (-57))", self.fc.visit(node))
node = ast.parse("31 % x")
self.assertEqual("(31 % x)", self.fc.visit(node))
node = ast.parse("y % 57")
self.assertEqual("(y % 57)", self.fc.visit(node))
node = ast.parse("x % y")
self.assertEqual("(x % y)", self.fc.visit(node))
node = ast.parse("x % y % z")
self.assertEqual("((x % y) % z)", self.fc.visit(node))
node = ast.parse("x.i % y.i")
self.assertEqual("(x.i % y.i)", self.fc.visit(node))
node = ast.parse("x.a_method(a) % y.a_method(b)")
self.assertEqual("(x.a_method(a) % y.a_method(b))", self.fc.visit(node))
def test_pow(self):
node = ast.parse("31 ** 57")
self.assertEqual("pow(31, 57)", self.fc.visit(node))
node = ast.parse("31 ** (-57)")
self.assertEqual("pow(31, (-57))", self.fc.visit(node))
node = ast.parse("31 ** x")
self.assertEqual("pow(31, x)", self.fc.visit(node))
node = ast.parse("y ** 57")
self.assertEqual("pow(y, 57)", self.fc.visit(node))
node = ast.parse("x ** y")
self.assertEqual("pow(x, y)", self.fc.visit(node))
node = ast.parse("x ** y ** z")
self.assertEqual("pow(x, pow(y, z))", self.fc.visit(node))
node = ast.parse("x.i ** y.i")
self.assertEqual("pow(x.i, y.i)", self.fc.visit(node))
node = ast.parse("x.a_method(a)** y.a_method(b)")
self.assertEqual("pow(x.a_method(a), y.a_method(b))", self.fc.visit(node))
def test_lshift(self):
node = ast.parse("0b11010101 << 7")
self.assertEqual("(213 << 7)", self.fc.visit(node))
node = ast.parse("0b11010101 << (-7)")
self.assertEqual("(213 << (-7))", self.fc.visit(node))
node = ast.parse("0b11010101 << x")
self.assertEqual("(213 << x)", self.fc.visit(node))
node = ast.parse("y << 7")
self.assertEqual("(y << 7)", self.fc.visit(node))
node = ast.parse("x << y")
self.assertEqual("(x << y)", self.fc.visit(node))
node = ast.parse("x << y << z")
self.assertEqual("((x << y) << z)", self.fc.visit(node))
node = ast.parse("x.i << y.i")
self.assertEqual("(x.i << y.i)", self.fc.visit(node))
node = ast.parse("x.a_method(a) << y.a_method(b)")
self.assertEqual("(x.a_method(a) << y.a_method(b))", self.fc.visit(node))
def test_bit_or(self):
node = ast.parse("0b11010101 | 0b0111")
self.assertEqual("(213 | 7)", self.fc.visit(node))
node = ast.parse("0b11010101 | x")
self.assertEqual("(213 | x)", self.fc.visit(node))
node = ast.parse("y | 0b0111")
self.assertEqual("(y | 7)", self.fc.visit(node))
node = ast.parse("x | y")
self.assertEqual("(x | y)", self.fc.visit(node))
node = ast.parse("x | y | z")
self.assertEqual("((x | y) | z)", self.fc.visit(node))
node = ast.parse("x.i | y.i")
self.assertEqual("(x.i | y.i)", self.fc.visit(node))
node = ast.parse("x.a_method(a) | y.a_method(b)")
self.assertEqual("(x.a_method(a) | y.a_method(b))", self.fc.visit(node))
def test_bit_xor(self):
node = ast.parse("0b11010101 ^ 0b0111")
self.assertEqual("(213 ^ 7)", self.fc.visit(node))
node = ast.parse("0b11010101 ^ x")
self.assertEqual("(213 ^ x)", self.fc.visit(node))
node = ast.parse("y ^ 0b0111")
self.assertEqual("(y ^ 7)", self.fc.visit(node))
node = ast.parse("x ^ y")
self.assertEqual("(x ^ y)", self.fc.visit(node))
node = ast.parse("x ^ y ^ z")
self.assertEqual("((x ^ y) ^ z)", self.fc.visit(node))
node = ast.parse("x.i ^ y.i")
self.assertEqual("(x.i ^ y.i)", self.fc.visit(node))
node = ast.parse("x.a_method(a) ^ y.a_method(b)")
self.assertEqual("(x.a_method(a) ^ y.a_method(b))", self.fc.visit(node))
def test_bit_and(self):
node = ast.parse("0b11010101 & 0b0111")
self.assertEqual("(213 & 7)", self.fc.visit(node))
node = ast.parse("0b11010101 & x")
self.assertEqual("(213 & x)", self.fc.visit(node))
node = ast.parse("y & 0b0111")
self.assertEqual("(y & 7)", self.fc.visit(node))
node = ast.parse("x & y")
self.assertEqual("(x & y)", self.fc.visit(node))
node = ast.parse("x & y & z")
self.assertEqual("((x & y) & z)", self.fc.visit(node))
node = ast.parse("x.i & y.i")
self.assertEqual("(x.i & y.i)", self.fc.visit(node))
node = ast.parse("x.a_method(a) & y.a_method(b)")
self.assertEqual("(x.a_method(a) & y.a_method(b))", self.fc.visit(node))
def test_and(self):
node = ast.parse("a and b")
self.assertEqual("(a && b)", self.fc.visit(node))
node = ast.parse("not a and b")
self.assertEqual("((!a) && b)", self.fc.visit(node))
node = ast.parse("a and not b")
self.assertEqual("(a && (!b))", self.fc.visit(node))
node = ast.parse("a and b and c")
self.assertEqual("(a && b && c)", self.fc.visit(node))
node = ast.parse("a and b and c and d")
self.assertEqual("(a && b && c && d)", self.fc.visit(node))
node = ast.parse("a and (b and c)")
self.assertEqual("(a && (b && c))", self.fc.visit(node))
node = ast.parse("a and b or c")
self.assertEqual("((a && b) || c)", self.fc.visit(node))
node = ast.parse("a and (b or c)")
self.assertEqual("(a && (b || c))", self.fc.visit(node))
def test_or(self):
node = ast.parse("a or b")
self.assertEqual("(a || b)", self.fc.visit(node))
node = ast.parse("not a or b")
self.assertEqual("((!a) || b)", self.fc.visit(node))
node = ast.parse("a or not b")
self.assertEqual("(a || (!b))", self.fc.visit(node))
node = ast.parse("a or b or c")
self.assertEqual("(a || b || c)", self.fc.visit(node))
node = ast.parse("a or b or c or d")
self.assertEqual("(a || b || c || d)", self.fc.visit(node))
node = ast.parse("a or (b or c)")
self.assertEqual("(a || (b || c))", self.fc.visit(node))
node = ast.parse("a or b and c")
self.assertEqual("(a || (b && c))", self.fc.visit(node))
node = ast.parse("(a or b) and c")
self.assertEqual("((a || b) && c)", self.fc.visit(node))
def test_noteq(self):
# object comparison not yet supported
node = ast.parse("1 != 3")
self.assertEqual("(1 != 3)", self.fc.visit(node))
node = ast.parse("1 != 3 != 4")
self.assertEqual("(1 != 3 && 3 != 4)", self.fc.visit(node))
node = ast.parse("a != 1")
self.assertEqual("(a != 1)", self.fc.visit(node))
node = ast.parse("a != b != c")
self.assertEqual("(a != b && b != c)", self.fc.visit(node))
node = ast.parse("a != x.some_method(b)")
self.assertEqual("(a != x.some_method(b))", self.fc.visit(node))
node = ast.parse("x.some_method(a) != x.some_method(b) " +
"!= x.some_method(c) != x.some_method(d)")
self.assertEqual("(x.some_method(a) != x.some_method(b) " +
"&& x.some_method(b) != x.some_method(c) " +
"&& x.some_method(c) != x.some_method(d))",
self.fc.visit(node))
def test_lessthan(self):
node = ast.parse("1 < 3")
self.assertEqual("(1 < 3)", self.fc.visit(node))
node = ast.parse("1 < 3 < 4")
self.assertEqual("(1 < 3 && 3 < 4)", self.fc.visit(node))
node = ast.parse("a < 1")
self.assertEqual("(a < 1)", self.fc.visit(node))
node = ast.parse("a < b < c")
self.assertEqual("(a < b && b < c)", self.fc.visit(node))
node = ast.parse("a < x.some_method(b)")
self.assertEqual("(a < x.some_method(b))", self.fc.visit(node))
node = ast.parse("x.some_method(a) < x.some_method(b) " +
"< x.some_method(c) < x.some_method(d)")
self.assertEqual("(x.some_method(a) < x.some_method(b) " +
"&& x.some_method(b) < x.some_method(c) " +
"&& x.some_method(c) < x.some_method(d))",
self.fc.visit(node))
def test_lessthaneq(self):
node = ast.parse("1 <= 3")
self.assertEqual("(1 <= 3)", self.fc.visit(node))
node = ast.parse("1 <= 3 <= 4")
self.assertEqual("(1 <= 3 && 3 <= 4)", self.fc.visit(node))
node = ast.parse("a <= 1")
self.assertEqual("(a <= 1)", self.fc.visit(node))
node = ast.parse("a <= b <= c")
self.assertEqual("(a <= b && b <= c)", self.fc.visit(node))
node = ast.parse("a <= x.some_method(b)")
self.assertEqual("(a <= x.some_method(b))", self.fc.visit(node))
node = ast.parse("x.some_method(a) <= x.some_method(b) " +
"<= x.some_method(c) <= x.some_method(d)")
self.assertEqual("(x.some_method(a) <= x.some_method(b) " +
"&& x.some_method(b) <= x.some_method(c) " +
"&& x.some_method(c) <= x.some_method(d))",
self.fc.visit(node))
def test_greaterthan(self):
node = ast.parse("1 > 3")
self.assertEqual("(1 > 3)", self.fc.visit(node))
node = ast.parse("1 > 3 > 4")
self.assertEqual("(1 > 3 && 3 > 4)", self.fc.visit(node))
node = ast.parse("a > 1")
self.assertEqual("(a > 1)", self.fc.visit(node))
node = ast.parse("a > b > c")
self.assertEqual("(a > b && b > c)", self.fc.visit(node))
node = ast.parse("a > x.some_method(b)")
self.assertEqual("(a > x.some_method(b))", self.fc.visit(node))
node = ast.parse("x.some_method(a) > x.some_method(b) " +
"> x.some_method(c) > x.some_method(d)")
self.assertEqual("(x.some_method(a) > x.some_method(b) " +
"&& x.some_method(b) > x.some_method(c) " +
"&& x.some_method(c) > x.some_method(d))",
self.fc.visit(node))
def test_greaterthaneq(self):
node = ast.parse("1 >= 3")
self.assertEqual("(1 >= 3)", self.fc.visit(node))
node = ast.parse("1 >= 3 >= 4")
self.assertEqual("(1 >= 3 && 3 >= 4)", self.fc.visit(node))
node = ast.parse("a >= 1")
self.assertEqual("(a >= 1)", self.fc.visit(node))
node = ast.parse("a >= b >= c")
self.assertEqual("(a >= b && b >= c)", self.fc.visit(node))
node = ast.parse("a >= x.some_method(b)")
self.assertEqual("(a >= x.some_method(b))", self.fc.visit(node))
node = ast.parse("x.some_method(a) >= x.some_method(b) " +
">= x.some_method(c) >= x.some_method(d)")
self.assertEqual("(x.some_method(a) >= x.some_method(b) " +
"&& x.some_method(b) >= x.some_method(c) " +
"&& x.some_method(c) >= x.some_method(d))",
self.fc.visit(node))
def test_is(self):
# object comparison not yet supported
node = ast.parse("1 is 3")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("1 is 3 is 4")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("a is 1")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("a is b is c")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("a is x.some_method(b)")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("x.some_method(a) is x.some_method(b)" +
" is x.some_method(c) is x.some_method(d)")
self.assertRaises(SyntaxError, self.fc.visit, node)
def test_is_not(self):
# object comparison not yet supported
node = ast.parse("1 is not 3")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("1 is not 3 is not 4")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("a is not 1")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("a is not b is not c")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("a is not x.some_method(b)")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("x.some_method(a) is not x.some_method(b)" +
" is not x.some_method(c) is not x.some_method(d)")
self.assertRaises(SyntaxError, self.fc.visit, node)
def test_in(self):
node = ast.parse("1 in [1, 2, 3]")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("1 in (1, 2, 3)")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("a in (1, 2, 3)")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("a in some_list")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("(a in some_list) in (True)")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("x.some_method(a) in some_list")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("x.some_method(a) in get_list()")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("x.some_method(a) in x.get_list()")
self.assertRaises(SyntaxError, self.fc.visit, node)
def test_not_in(self):
node = ast.parse("1 in [1, 2, 3]")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("1 in (1, 2, 3)")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("a in (1, 2, 3)")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("a in some_list")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("(a in some_list) in (True)")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("x.some_method(a) in some_list")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("x.some_method(a) in get_list()")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("x.some_method(a) in x.get_list()")
self.assertRaises(SyntaxError, self.fc.visit, node)
def test_slice(self):
node = ast.parse("some_list[0:5]")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("some_list[i:i+5]")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("some_list[i + j : i + j + 5]")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("some_list[func1() : func2()]")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("some_list[func(i) : func(j)]")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("some_list[x.some_method(i) : x.some_method(j)]")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("get_list()[1:5]")
self.assertRaises(SyntaxError, self.fc.visit, node)
node = ast.parse("x.get_list()[x.some_method(i): x.some_method(j)]")
self.assertRaises(SyntaxError, self.fc.visit, node)