@@ -87,6 +87,7 @@ func (g *pyGen) genFuncSig(sym *symbol, fsym *Func) bool {
8787 return false
8888 }
8989 anm := pySafeArg (arg .Name (), i )
90+
9091 if ifchandle && arg .sym .goname == "interface{}" {
9192 goArgs = append (goArgs , fmt .Sprintf ("%s %s" , anm , CGoHandle ))
9293 pyArgs = append (pyArgs , fmt .Sprintf ("param('%s', '%s')" , PyHandle , anm ))
@@ -98,7 +99,10 @@ func (g *pyGen) genFuncSig(sym *symbol, fsym *Func) bool {
9899 pyArgs = append (pyArgs , fmt .Sprintf ("param('%s', '%s')" , sarg .cpyname , anm ))
99100 }
100101 }
101- wpArgs = append (wpArgs , anm )
102+
103+ if i != nargs - 1 || ! fsym .isVariadic {
104+ wpArgs = append (wpArgs , anm )
105+ }
102106 }
103107
104108 // support for optional arg to run in a separate go routine -- only if no return val
@@ -108,6 +112,11 @@ func (g *pyGen) genFuncSig(sym *symbol, fsym *Func) bool {
108112 wpArgs = append (wpArgs , "goRun=False" )
109113 }
110114
115+ // To support variadic args, we add *args at the end.
116+ if fsym .isVariadic {
117+ wpArgs = append (wpArgs , "*args" )
118+ }
119+
111120 // When building the pybindgen builder code, we start with
112121 // a function that adds function calls with exception checking.
113122 // But given specific return types, we may want to add more
@@ -276,25 +285,6 @@ if __err != nil {
276285 g .gofile .Printf ("var __err error\n " )
277286 }
278287
279- // pywrap output
280- mnm := fsym .ID ()
281- if isMethod {
282- mnm = sym .id + "_" + fsym .GoName ()
283- }
284- rvHasHandle := false
285- if nres > 0 {
286- ret := res [0 ]
287- if ! rvIsErr && ret .sym .hasHandle () {
288- rvHasHandle = true
289- cvnm := ret .sym .pyPkgId (g .pkg .pkg )
290- g .pywrap .Printf ("return %s(handle=_%s.%s(" , cvnm , pkgname , mnm )
291- } else {
292- g .pywrap .Printf ("return _%s.%s(" , pkgname , mnm )
293- }
294- } else {
295- g .pywrap .Printf ("_%s.%s(" , pkgname , mnm )
296- }
297-
298288 callArgs := []string {}
299289 wrapArgs := []string {}
300290 if isMethod {
@@ -313,6 +303,9 @@ if __err != nil {
313303 default :
314304 na = anm
315305 }
306+ if i == len (args ) - 1 && fsym .isVariadic {
307+ na = na + "..."
308+ }
316309 callArgs = append (callArgs , na )
317310 switch {
318311 case arg .sym .goname == "interface{}" :
@@ -326,6 +319,34 @@ if __err != nil {
326319 default :
327320 wrapArgs = append (wrapArgs , anm )
328321 }
322+
323+ // To support variadic args, we add *args at the end.
324+ if fsym .isVariadic && i == len (args )- 1 {
325+ packagePrefix := ""
326+ if arg .sym .gopkg .Name () != fsym .pkg .Name () {
327+ packagePrefix = arg .sym .gopkg .Name () + "."
328+ }
329+ g .pywrap .Printf ("%s = %s%s(args)\n " , anm , packagePrefix , arg .sym .id )
330+ }
331+ }
332+
333+ // pywrap output
334+ mnm := fsym .ID ()
335+ if isMethod {
336+ mnm = sym .id + "_" + fsym .GoName ()
337+ }
338+ rvHasHandle := false
339+ if nres > 0 {
340+ ret := res [0 ]
341+ if ! rvIsErr && ret .sym .hasHandle () {
342+ rvHasHandle = true
343+ cvnm := ret .sym .pyPkgId (g .pkg .pkg )
344+ g .pywrap .Printf ("return %s(handle=_%s.%s(" , cvnm , pkgname , mnm )
345+ } else {
346+ g .pywrap .Printf ("return _%s.%s(" , pkgname , mnm )
347+ }
348+ } else {
349+ g .pywrap .Printf ("_%s.%s(" , pkgname , mnm )
329350 }
330351
331352 hasRetCvt := false
0 commit comments