def test_free_vars(self): stmt = ast.parse("foo", "", "single") with self.assertRaises(ValueError): freevars(stmt, []) suite = ast.parse("foo; bar();", "exec") with self.assertRaises(ValueError): freevars(suite, []) def freevars_(source, env=[]): return freevars(ast.parse(source, "", "eval"), env) self.assertEqual(freevars_("1"), []) self.assertEqual(freevars_("..."), []) self.assertEqual(freevars_("a"), ["a"]) self.assertEqual(freevars_("a", ["a"]), []) self.assertEqual(freevars_("f(1)"), ["f"]) self.assertEqual(freevars_("f(x)"), ["f", "x"]) self.assertEqual(freevars_("f(x)", ["f"]), ["x"]) self.assertEqual(freevars_("a + 1"), ["a"]) self.assertEqual(freevars_("a + b"), ["a", "b"]) self.assertEqual(freevars_("a + b", ["a", "b"]), []) self.assertEqual(freevars_("a[b]"), ["a", "b"]) self.assertEqual(freevars_("a[b]", ["a", "b"]), []) self.assertEqual(freevars_("f(x, *a)", ["f"]), ["x", "a"]) self.assertEqual(freevars_("f(x, *a, y=1)", ["f"]), ["x", "a"]) self.assertEqual(freevars_("f(x, *a, y=1, **k)", ["f"]), ["x", "a", "k"]) if sys.version_info >= (3, 5): self.assertEqual(freevars_("f(*a, *b, k=c, **d, **e)", ["f"]), ["a", "b", "c", "d", "e"]) self.assertEqual(freevars_("True"), []) self.assertEqual(freevars_("'True'"), []) self.assertEqual(freevars_("None"), []) self.assertEqual(freevars_("b'None'"), []) self.assertEqual(freevars_("a < b"), ["a", "b"]) self.assertEqual(freevars_("a < b <= c"), ["a", "b", "c"]) self.assertEqual(freevars_("1 < a <= 3"), ["a"]) self.assertEqual(freevars_("{}"), []) self.assertEqual(freevars_("[]"), []) self.assertEqual(freevars_("()"), []) self.assertEqual(freevars_("[a, 1]"), ["a"]) self.assertEqual(freevars_("{a: b}"), ["a", "b"]) self.assertEqual(freevars_("{a, b}"), ["a", "b"]) self.assertEqual(freevars_("0 if abs(a) < 0.1 else b", ["abs"]), ["a", "b"]) self.assertEqual(freevars_("lambda a: b + 1"), ["b"]) self.assertEqual(freevars_("lambda a: b + 1", ["b"]), []) self.assertEqual(freevars_("lambda a: a + 1"), []) self.assertEqual(freevars_("(lambda a: a + 1)(a)"), ["a"]) self.assertEqual(freevars_("lambda a, *arg: arg + (a,)"), []) self.assertEqual(freevars_("lambda a, *arg, **kwargs: arg + (a,)"), []) self.assertEqual(freevars_("[a for a in b]"), ["b"]) self.assertEqual(freevars_("[1 + a for c in b if c]"), ["a", "b"]) self.assertEqual(freevars_("{a for _ in [] if b}"), ["a", "b"]) self.assertEqual(freevars_("{a for _ in [] if b}", ["a", "b"]), [])
def freevars_(source, env=[]): return freevars(ast.parse(source, "", "eval"), env)
def freevars_(source, env=None): return freevars(ast.parse(source, "", "eval"), env or [])