@@ -122,37 +122,8 @@ func fieldsN(s string, n int) []string {
122122}
123123
124124func 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