Skip to content

Commit 9c36f4c

Browse files
SanggiHongcorona10
authored andcommitted
set: Implement initialization set with sequence (#100)
* set: Implement initialization set with sequence * Remove comment * Remove typo * set: Improve test code
1 parent 8c361a8 commit 9c36f4c

File tree

3 files changed

+37
-4
lines changed

3 files changed

+37
-4
lines changed

py/sequence.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,26 @@ func SequenceList(v Object) (*List, error) {
4343
}
4444
}
4545

46+
// Converts a sequence object v into a Set
47+
func SequenceSet(v Object) (*Set, error) {
48+
switch x := v.(type) {
49+
case Tuple:
50+
return NewSetFromItems(x), nil
51+
case *List:
52+
return NewSetFromItems(x.Items), nil
53+
default:
54+
s := NewSet()
55+
err := Iterate(v, func(item Object) bool {
56+
s.Add(item)
57+
return false
58+
})
59+
if err != nil {
60+
return nil, err
61+
}
62+
return s, nil
63+
}
64+
}
65+
4666
// Call __next__ for the python object
4767
//
4868
// Returns the next object

py/set.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,10 @@ func SetNew(metatype *Type, args Tuple, kwargs StringDict) (Object, error) {
5656
if err != nil {
5757
return nil, err
5858
}
59-
if iterable == nil {
60-
return NewSet(), nil
59+
if iterable != nil {
60+
return SequenceSet(iterable)
6161
}
62-
// FIXME should be able to initialise from an iterable!
63-
return NewSetFromItems(iterable.(Tuple)), nil
62+
return NewSet(), nil
6463
}
6564

6665
var FrozenSetType = NewType("frozenset", "frozenset() -> empty frozenset object\nfrozenset(iterable) -> frozenset object\n\nBuild an immutable unordered collection of unique elements.")

py/tests/set.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,20 @@
5555

5656
d = a ^ b
5757
assert 1 in c
58+
59+
doc="set"
60+
a = set([1,2,3])
61+
b = set("set")
62+
c = set((4,5))
63+
assert len(a) == 3
64+
assert len(b) == 3
65+
assert len(c) == 2
66+
assert 1 in a
67+
assert 2 in a
68+
assert 3 in a
69+
assert "s" in b
70+
assert "e" in b
71+
assert "t" in b
5872
assert 4 in c
5973
assert 5 in c
6074

0 commit comments

Comments
 (0)