如何将NSDictionary转换为Python字典?

问题描述:

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

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

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

编辑:为了澄清,我将原来的Python转换为Objective-C,并且无法找出如何从Objective-C中的NSDictionary移动到Python字典中。当我调用其余的Python脚本时传递。 Objective-C类基本上只是一个Python加载器,但我对Python C API不熟悉,并且无法找到哪些示例或函数可以帮助我。

+0

我有点惊讶,你不能只是通过PyObjC将NSDictionary传递到Python,然后把它像一个普通的Python字典。有没有具体的东西没有用? – bbum 2009-09-20 00:43:54

+0

可能只是我的知识,如何做到这一点;关心如何使用PyObjC从Objective-C类中调用Python函数并将其传递给NSDictionary? PyObjC的C API文档也很棒;看起来却找不到任何东西。 – 2009-09-20 15:38:49

+0

其实,没有必要的代码;我没有注意到迈克尔已经在下面第二次回答我了!哎呦。 :-) – 2009-09-20 15:47:52

哦,看起来像我误解了你的问题。那么,走向另一个方向并不是非常不同。这应该是(至少作为一个开始)你正在寻找的功能(我没有测试它彻底的,所以虫子的提防):

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

+0

谢谢Michael!在我发布这个问题之前,我查看了C API,但是我无法弄清楚如何在Objective-C NS对象中使用PyDict方法(仍然从我的C上除尘;一直以来我都不得不考虑指针等等向前)。感谢您的入门代码! – 2009-09-20 15:51:17