如何将NSDictionary转换为Python dict?

时间:2009-09-19 21:47:04

标签: python objective-c pyobjc

我有一个使用PyObjC完全用Python编写的插件,我需要将其核心类转换为Objective-C。其中一个基本上只是加载一个Python模块并执行一个特定的函数,传递它的关键字参数。在PyObjC中,这非常非常。

但是,我很难弄清楚如何使用Python C API做同样的事情。特别是,我不确定如何最好地将NSDictionary(可能包含整数,字符串,布尔值或上述所有内容)转换为格式,然后我可以将其作为关键字参数传递给Python。

任何人都有关于如何完成这样的事情的指示?提前谢谢!

编辑:只是为了澄清,我正在将我以前使用Python的现有类转换为Objective-C,并且无法弄清楚如何从Objective-C中的NSDictionary转换为Python字典我可以在调用剩余的Python脚本时传递。 Objective-C类基本上只是一个Python加载器,但我不熟悉Python C API,并且无法找到哪些内容可以帮助我查找示例或函数。

1 个答案:

答案 0 :(得分:2)

哦,看起来我误解了你的问题。那么,走向另一个方向并没有太大的不同。这应该是(至少是一个开始)你正在寻找的功能(虽然我没有彻底测试过,所以要小心这些错误):

// 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;
    }
}

您可能还想查看Python/C API Reference manual(如果您还没有)。