Skip to content

Commit 8ed73c5

Browse files
committed
py: refactor str.split into String.Split
1 parent 3d9f636 commit 8ed73c5

File tree

1 file changed

+44
-40
lines changed

1 file changed

+44
-40
lines changed

py/string.go

Lines changed: 44 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -122,37 +122,8 @@ func fieldsN(s string, n int) []string {
122122
}
123123

124124
func init() {
125-
StringType.Dict["split"] = MustNewMethod("split", func(self Object, args Tuple) (Object, error) {
126-
selfStr := self.(String)
127-
var value Object = None
128-
zeroRemove := true
129-
if len(args) > 0 {
130-
if _, ok := args[0].(NoneType); !ok {
131-
value = args[0]
132-
zeroRemove = false
133-
}
134-
}
135-
var maxSplit int = -2
136-
if len(args) > 1 {
137-
if m, ok := args[1].(Int); ok {
138-
maxSplit = int(m)
139-
}
140-
}
141-
var valArray []string
142-
if valStr, ok := value.(String); ok {
143-
valArray = strings.SplitN(string(selfStr), string(valStr), maxSplit+1)
144-
} else if _, ok := value.(NoneType); ok {
145-
valArray = fieldsN(string(selfStr), maxSplit)
146-
} else {
147-
return nil, ExceptionNewf(TypeError, "Can't convert '%s' object to str implicitly", value.Type())
148-
}
149-
o := List{}
150-
for _, j := range valArray {
151-
if len(j) > 0 || !zeroRemove {
152-
o.Items = append(o.Items, String(j))
153-
}
154-
}
155-
return &o, nil
125+
StringType.Dict["split"] = MustNewMethod("split", func(self Object, args Tuple, kwargs StringDict) (Object, error) {
126+
return self.(String).Split(args, kwargs)
156127
}, 0, "split(sub) -> split string with sub.")
157128

158129
StringType.Dict["startswith"] = MustNewMethod("startswith", func(self Object, args Tuple) (Object, error) {
@@ -597,13 +568,46 @@ func (s String) M__contains__(item Object) (Object, error) {
597568
return NewBool(strings.Contains(string(s), string(needle))), nil
598569
}
599570

571+
func (s String) Split(args Tuple, kwargs StringDict) (Object, error) {
572+
var (
573+
pyval Object = None
574+
pymax Object = Int(-2)
575+
pyfmt = "|Oi:split"
576+
kwlst = []string{"sep", "maxsplit"}
577+
)
578+
err := ParseTupleAndKeywords(args, kwargs, pyfmt, kwlst, &pyval, &pymax)
579+
if err != nil {
580+
return nil, err
581+
}
582+
583+
var (
584+
max = pymax.(Int)
585+
vs []string
586+
)
587+
switch v := pyval.(type) {
588+
case String:
589+
vs = strings.SplitN(string(s), string(v), int(max)+1)
590+
case NoneType:
591+
vs = fieldsN(string(s), int(max))
592+
default:
593+
return nil, ExceptionNewf(TypeError, "Can't convert '%s' object to str implicitly", pyval.Type())
594+
}
595+
o := List{}
596+
for _, j := range vs {
597+
o.Items = append(o.Items, String(j))
598+
}
599+
return &o, nil
600+
}
601+
600602
// Check stringerface is satisfied
601-
var _ richComparison = String("")
602-
var _ sequenceArithmetic = String("")
603-
var _ I__mod__ = String("")
604-
var _ I__rmod__ = String("")
605-
var _ I__imod__ = String("")
606-
var _ I__len__ = String("")
607-
var _ I__bool__ = String("")
608-
var _ I__getitem__ = String("")
609-
var _ I__contains__ = String("")
603+
var (
604+
_ richComparison = String("")
605+
_ sequenceArithmetic = String("")
606+
_ I__mod__ = String("")
607+
_ I__rmod__ = String("")
608+
_ I__imod__ = String("")
609+
_ I__len__ = String("")
610+
_ I__bool__ = String("")
611+
_ I__getitem__ = String("")
612+
_ I__contains__ = String("")
613+
)

0 commit comments

Comments
 (0)