Попробуйте:
Array.prototype.findKey = function(key){
let res = [];
function traverseChildren(input, lookFor) {
//By default, imagine what we are looking at is JSON...
let children = Object.keys(input);
//... however, if it is an array, just stick with that.
if (Array.isArray(input)){
children = input;
}
//Go through everything in the target
for (i = 0; i < children.length; i++) {
//Have we found the *key* we are looking for?
if (children[i] === lookFor && Array.isArray(input)) {
//If so, record the value.
res.push(input[lookFor]);
} else {
//If not, keep searching.
traverseChildren(input[children[i]]);
}
}
}
traverseChildren(this, key);
return res;
}
Я соглашаюсь с кассиром, необходимо использовать ctypes вместо этого. Это всегда легче, чем размышление о typemaps.
Но, если Вы - тупик при использовании большого глотка, что необходимо сделать, делают typemap для void**
это ВОЗВРАЩАЕТСЯ недавно выделенный void*
:
%typemap (in,numinputs=0) void** (void *temp)
{
$1 = &temp;
}
%typemap (argout) void**
{
PyObject *obj = PyCObject_FromVoidPtr(*$1);
$result = PyTuple_Pack(2, $result, obj);
}
Затем Ваш Python похож:
import test
success, p = test.Operation()
theAnswer = 0.0f
if success:
theAnswer = test.GetFieldValue(p)
test.Cleanup(p)
Править:
Я ожидал бы, что большой глоток обработает простое значением void*
аргумент корректно самостоятельно, но на всякий случай, вот является кодом большого глотка для обертывания void*
для GetFieldValue () и очистка ():
%typemap (in) void*
{
$1 = PyCObject_AsVoidPtr($input);
}
Вы были бы готовы использовать ctypes? Вот пример кода, который должен работать (хотя он не тестируется):
from ctypes import *
test = cdll("mydll")
test.Operation.restype = c_bool
test.Operation.argtypes = [POINTER(c_void_p)]
test.GetFieldValue.restype = c_float
test.GetFieldValue.argtypes = [c_void_p]
test.Cleanup.restype = None
test.Cleanup.argtypes = [c_void_p]
if __name__ == "__main__":
p = c_void_p()
if test.Operation(byref(p)):
theAnswer = test.GetFieldValue(p)
test.Cleanup(p)