Frage

Ich habe ein Plugin komplett in Python geschrieben Klassen PyObjC dessen Kern muß ich Objective-C konvertieren. Einer von ihnen im Grunde lädt nur ein Python-Modul und führt eine bestimmte Funktion, es Keyword-Argumente übergeben. In PyObjC, das war extrem.

Aber ich habe Schwierigkeiten, herauszufinden, wie die gleiche Sache zu tun, um den Python-C-API verwenden. Insbesondere, ich bin nicht sicher, wie man am besten ein NSDictionary zu konvertieren (die ganzen Zahlen halten könnte, Strings, Boolesche Werte, oder alle der oben genannten) in ein Format, das ich dann auf Python als Keyword-Argumente übergeben zu können.

Wer noch Hinweise, wie man so etwas wie dies zu erreichen? Vielen Dank im Voraus!

Bearbeiten : nur zu klären, ich bin Umwandlung meiner bestehende Klasse, die frühen Python war in Objective-C, und Mühe habe, herauszufinden, wie aus einem NSDictionary in Objective-C ein bewegen Python Wörterbuch ich weitergeben kann, wenn ich die restlichen Python-Skripten aufrufen. Die Objective-C-Klasse ist im Grunde nur ein Python-Loader, aber ich bin nicht mit dem Python-C-API und Mühe habe, herauszufinden, wo für Beispiele oder Funktionen zu suchen, die mir helfen werden.

War es hilfreich?

Lösung

Oh, sieht aus wie ich Ihre Frage falsch verstanden. Nun, in die andere Richtung gehen ist nicht sehr unterschiedlich. Dies soll (wie dest einen Anfang) die Funktion Sie suchen (Ich habe es nicht gründlich getestet, obwohl, so hüte dich vor den Wanzen):

// Returns a new reference
PyObject *ObjcToPyObject(id object)
{
    if (object == nil) {
        // This technically doesn't need to be an extra case, 
        // but you may want to differentiate it for error checking
        return NULL;
    } else if ([object isKindOfClass:[NSString class]]) {
        return PyString_FromString([object UTF8String]);
    } else if ([object isKindOfClass:[NSNumber class]]) {
        // You could probably do some extra checking here if you need to
        // with the -objCType method.
        return PyLong_FromLong([object longValue]);
    } else if ([object isKindOfClass:[NSArray class]]) {
        // You may want to differentiate between NSArray (analagous to tuples) 
        // and NSMutableArray (analagous to lists) here.
        Py_ssize_t i, len = [object count];
        PyObject *list = PyList_New(len);
        for (i = 0; i < len; ++i) {
            PyObject *item = ObjcToPyObject([object objectAtIndex:i]);
            NSCAssert(item != NULL, @"Can't add NULL item to Python List");
            // Note that PyList_SetItem() "steals" the reference to the passed item.
            // (i.e., you do not need to release it)
            PyList_SetItem(list, i, item);
        }
        return list;
    } else if ([object isKindOfClass:[NSDictionary class]]) {
        PyObject *dict = PyDict_New();
        for (id key in object) {
            PyObject *pyKey = ObjcToPyObject(key);
            NSCAssert(pyKey != NULL, @"Can't add NULL key to Python Dictionary");
            PyObject *pyItem = ObjcToPyObject([object objectForKey:key]);
            NSCAssert(pyItem != NULL, @"Can't add NULL item to Python Dictionary");
            PyDict_SetItem(dict, pyKey, pyItem);
            Py_DECREF(pyKey);
            Py_DECREF(pyItem);
        }
        return dict;
    } else {
        NSLog(@"ObjcToPyObject() could not convert Obj-C object to PyObject.");
        return NULL;
    }
}

Sie können auch auf dem Python / C API-Referenzhandbuch einen Blick nehmen , wenn Sie nicht bereits haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top