2009-09-19 3 views
2

핵심 클래스를 Objective-C로 변환해야하는 PyObjC를 사용하여 Python으로 완전히 작성된 플러그인이 있습니다. 그 중 하나는 기본적으로 Python 모듈을로드하고 키워드 인수를 전달하여 특정 함수를 실행합니다. PyObjC에서는 이것이 매우 컸습니다.NSDictionary를 Python dict로 변환하는 방법은 무엇입니까?

그러나 Python C API를 사용하여 동일한 작업을 수행하는 방법을 찾는 데 어려움이 있습니다. 특히 NSDictionary (정수, 문자열, 부울 또는이 모두를 포함 할 수도 있음)를 키워드 인수로 전달할 수있는 형식으로 변환하는 것이 가장 확실하지 않습니다.

누구나 이런 식으로 수행하는 방법에 대한 지침이 있습니까? 미리 감사드립니다!

편집 : 그냥 명확히하기 위해, 나는 이전에 목표 - C로 파이썬이었다 기존 클래스를 변환하고있어, 그리고 문제가 내가 할 수있는 파이썬 사전에 목표 - C에있는 NSDictionary에서 이동하는 방법을 파악하는 데 문제 나머지 Python 스크립트를 호출 할 때 전달하십시오. Objective-C 클래스는 기본적으로 파이썬 로더이지만 Python C API에 익숙하지 않아 도움이 될만한 예제 나 함수를 어디서 찾을 지 알아 내려는 데 어려움을 겪고 있습니다.

+0

PyObjC를 통해 NSDictionary를 Python으로 전달한 다음 일반 Python 사전처럼 취급 할 수 없다는 사실에 조금 놀랐습니다. 작동하지 않는 특정 것이 있습니까? – bbum

+0

아마 그것을하는 방법에 대한 나의 지식. PyObjC를 사용하여 Objective-C 클래스 내에서 파이썬 함수를 호출하고 NSDictionary를 전달하는 방법에 대한 코드 예제를 공유하려고합니다. PyObjC 용 C API 문서는 훌륭 할 것이다. 보였지만 아무것도 찾을 수 없었습니다. –

+0

사실, 코드는 필요하지 않습니다. 나는 마이클이 나에게 두 번째로 아래에 응답했다는 것을 알아 차리지 못했다! 오케이. :-) –

답변

2

아, 내 질문에 오해 한 것 같습니다. 음, 다른 방향으로가는 것은별로 다르지 않습니다. 이것은 (최소로 시작) 당신이 찾고있는 기능 수 (I 철저하지만 그것을 테스트하지 않은, 그래서 버그 조심)해야합니다

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

감사합니다 마이클! 내가 질문을 게시하기 전에 C API를 살펴 봤지만 Objective-C NS 객체로 PyDict 메소드를 활용하는 방법을 알아낼 수 없었습니다 (여전히 C에서 먼지를 뽑았습니다. 포인터에 대해 생각해야했기 때문에 잠시있었습니다. 앞으로). 시작 코드 주셔서 감사합니다! –

관련 문제