| # for statements and list comprehensions | |
| # --- for statements --- | |
| # sequence assignment | |
| # Assignment to empty list/tuple is permitted. | |
| # https://github.com/bazelbuild/starlark/issues/93 for discussion. | |
| () = () | |
| [] = () | |
| # RHS not iterable | |
| x, y = 1 ### got 'int' in sequence assignment | |
| --- | |
| (x,) = 1 ### got 'int' in sequence assignment | |
| --- | |
| [x] = 1 ### got 'int' in sequence assignment | |
| --- | |
| # too few | |
| x, y = () ### too few values to unpack \(got 0, want 2\) | |
| --- | |
| [x, y] = () ### too few values to unpack \(got 0, want 2\) | |
| --- | |
| # just right | |
| x, y = 1, 2 | |
| --- | |
| [x, y] = 1, 2 | |
| --- | |
| (x,) = [1] | |
| --- | |
| # too many | |
| () = 1 ### got 'int' in sequence assignment | |
| --- | |
| () = (1,) ### too many values to unpack \(got 1, want 0\) | |
| --- | |
| x, y = 1, 2, 3 ### too many values to unpack \(got 3, want 2\) | |
| --- | |
| [x, y] = 1, 2, 3 ### too many values to unpack \(got 3, want 2\) | |
| --- | |
| # Assignment to empty tuple is permitted. | |
| # See https://github.com/bazelbuild/starlark/issues/93 for discussion. | |
| assert_eq([1 for [] in [(), []]], [1, 1]) | |
| # Iterating over dict without .items() gives informative error. | |
| assert_eq([v for v in dict(a = "b")], ["a"]) | |
| [None for () in dict(a = "b")] ### got 'string' in sequence assignment \(want 0-element sequence\) | |
| --- | |
| [None for (v1,) in dict(a = "b")] ### got 'string' in sequence assignment \(want 1-element sequence\) | |
| --- | |
| [None for v1, v2 in dict(a = "b")] ### got 'string' in sequence assignment \(want 2-element sequence\) | |
| --- | |
| # --- list comprehensions --- | |
| assert_eq(["foo/%s.java" % x for x in []], []) | |
| assert_eq( | |
| ["foo/%s.java" % y for y in ["bar", "wiz", "quux"]], | |
| ["foo/bar.java", "foo/wiz.java", "foo/quux.java"]) | |
| assert_eq( | |
| ["%s/%s.java" % (z, t) | |
| for z in ["foo", "bar"] | |
| for t in ["baz", "wiz", "quux"]], | |
| ["foo/baz.java", | |
| "foo/wiz.java", | |
| "foo/quux.java", | |
| "bar/baz.java", | |
| "bar/wiz.java", | |
| "bar/quux.java"]) | |
| assert_eq( | |
| ["%s/%s.java" % (b, b) | |
| for a in ["foo", "bar"] | |
| for b in ["baz", "wiz", "quux"]], | |
| ["baz/baz.java", | |
| "wiz/wiz.java", | |
| "quux/quux.java", | |
| "baz/baz.java", | |
| "wiz/wiz.java", | |
| "quux/quux.java"]) | |
| assert_eq( | |
| ["%s/%s.%s" % (c, d, e) | |
| for c in ["foo", "bar"] | |
| for d in ["baz", "wiz", "quux"] | |
| for e in ["java", "cc"]], | |
| ["foo/baz.java", | |
| "foo/baz.cc", | |
| "foo/wiz.java", | |
| "foo/wiz.cc", | |
| "foo/quux.java", | |
| "foo/quux.cc", | |
| "bar/baz.java", | |
| "bar/baz.cc", | |
| "bar/wiz.java", | |
| "bar/wiz.cc", | |
| "bar/quux.java", | |
| "bar/quux.cc"]) | |
| assert_eq([i for i in (1, 2)], [1,2]) | |
| assert_eq([i for i in [2, 3] or [1, 2]], [2, 3]) | |
| # nested list comprehensions | |
| li = [[1, 2], [3, 4]] | |
| assert_eq([j for i in li for j in i], [1,2,3,4]) | |
| input = [["abc"], ["def", "ghi"]] | |
| assert_eq( | |
| ["%s %s" % (b, c) | |
| for a in input | |
| for b in a | |
| for c in b.elems()], | |
| ["abc a", "abc b", "abc c", "def d", "def e", "def f", "ghi g", "ghi h", "ghi i"]) | |
| # filtering | |
| range3 = [0, 1, 2] | |
| assert_eq([a for a in (4, None, 2, None, 1) | |
| if a != None], | |
| [4, 2, 1]) | |
| assert_eq([b+c for b in [0, 1, 2] | |
| for c in [0, 1, 2] | |
| if b + c > 2], | |
| [3, 3, 4]) | |
| assert_eq([d+e for d in range3 | |
| if d % 2 == 1 | |
| for e in range3], | |
| [1, 2, 3]) | |
| assert_eq([[f, g] for f in [0, 1, 2, 3, 4] | |
| if f | |
| for g in [5, 6, 7, 8] | |
| if f * g % 12 == 0], | |
| [[2, 6], [3, 8], [4, 6]]) | |
| assert_eq([h for h in [4, 2, 0, 1] if h], [4, 2, 1]) | |
| # multiple variables, ok | |
| assert_eq([x + y for x, y in [(1, 2), (3, 4)]], [3, 7]) | |
| assert_eq([z + t for (z, t) in [[1, 2], [3, 4]]], [3, 7]) | |
| # multiple variables, fail | |
| [x + y for x, y, z in [(1, 2), (3, 4)]] ### too few values to unpack \(got 2, want 3\) | |
| --- | |
| [x + y for x, y in (1, 2)] ### got 'int' in sequence assignment \(want 2-element sequence\) | |
| --- | |
| [x + y for x, y, z in [(1, 2), (3, 4)]] ### too few values to unpack \(got 2, want 3\) | |
| --- | |
| [x + y for x, y in (1, 2)] ### got 'int' in sequence assignment \(want 2-element sequence\) | |
| --- | |
| [x + y for x, y, z in [(1, 2), (3, 4)]] ### too few values to unpack \(got 2, want 3\) | |
| --- | |
| [x2 + y2 for x2, y2 in (1, 2)] ### got 'int' in sequence assignment \(want 2-element sequence\) | |
| --- |