diff --git a/py/sequence.go b/py/sequence.go index 53e78295..430471c8 100644 --- a/py/sequence.go +++ b/py/sequence.go @@ -43,6 +43,26 @@ func SequenceList(v Object) (*List, error) { } } +// Converts a sequence object v into a Set +func SequenceSet(v Object) (*Set, error) { + switch x := v.(type) { + case Tuple: + return NewSetFromItems(x), nil + case *List: + return NewSetFromItems(x.Items), nil + default: + s := NewSet() + err := Iterate(v, func(item Object) bool { + s.Add(item) + return false + }) + if err != nil { + return nil, err + } + return s, nil + } +} + // Call __next__ for the python object // // Returns the next object diff --git a/py/set.go b/py/set.go index a27143ba..a09cc8d2 100644 --- a/py/set.go +++ b/py/set.go @@ -56,11 +56,10 @@ func SetNew(metatype *Type, args Tuple, kwargs StringDict) (Object, error) { if err != nil { return nil, err } - if iterable == nil { - return NewSet(), nil + if iterable != nil { + return SequenceSet(iterable) } - // FIXME should be able to initialise from an iterable! - return NewSetFromItems(iterable.(Tuple)), nil + return NewSet(), nil } var FrozenSetType = NewType("frozenset", "frozenset() -> empty frozenset object\nfrozenset(iterable) -> frozenset object\n\nBuild an immutable unordered collection of unique elements.") diff --git a/py/tests/set.py b/py/tests/set.py index f6fa539a..f2f867a7 100644 --- a/py/tests/set.py +++ b/py/tests/set.py @@ -55,6 +55,20 @@ d = a ^ b assert 1 in c + +doc="set" +a = set([1,2,3]) +b = set("set") +c = set((4,5)) +assert len(a) == 3 +assert len(b) == 3 +assert len(c) == 2 +assert 1 in a +assert 2 in a +assert 3 in a +assert "s" in b +assert "e" in b +assert "t" in b assert 4 in c assert 5 in c
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: