-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfunction.go
74 lines (61 loc) · 1.5 KB
/
function.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package gp
/*
#include <Python.h>
*/
import "C"
type Objecter interface {
cpyObj() *cPyObject
object() Object
Ensure()
}
type Func struct {
Object
}
func newFunc(obj *cPyObject) Func {
return Func{newObject(obj)}
}
func (f Func) Ensure() {
f.pyObject.Ensure()
}
func (f Func) Name() string {
return f.AttrString("__name__").String()
}
func (f Func) call(args Tuple, kwargs Dict) Object {
return newObject(C.PyObject_Call(f.obj, args.obj, kwargs.obj))
}
func (f Func) callNoArgs() Object {
return newObject(C.PyObject_CallNoArgs(f.obj))
}
func (f Func) callOneArg(arg Objecter) Object {
return newObject(C.PyObject_CallOneArg(f.obj, arg.cpyObj()))
}
func (f Func) CallObject(args Tuple) Object {
defer getGlobalData().decRefObjectsIfNeeded()
return newObject(C.PyObject_CallObject(f.obj, args.obj))
}
func (f Func) CallObjectKw(args Tuple, kw KwArgs) Object {
defer getGlobalData().decRefObjectsIfNeeded()
// Convert keyword arguments to Python dict
kwDict := MakeDict(nil)
for k, v := range kw {
kwDict.Set(MakeStr(k), From(v))
}
return f.call(args, kwDict)
}
func (f Func) Call(args ...any) Object {
argsTuple, kwArgs := splitArgs(args...)
if kwArgs == nil {
defer getGlobalData().decRefObjectsIfNeeded()
switch len(args) {
case 0:
return f.callNoArgs()
case 1:
return f.callOneArg(From(args[0]))
default:
return f.CallObject(argsTuple)
}
} else {
return f.CallObjectKw(argsTuple, kwArgs)
}
}
// ----------------------------------------------------------------------------