@@ -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