2

PyObjC を使用して完全に Python で記述されたプラグインがあり、そのコア クラスを Objective-C に変換する必要があります。そのうちの 1 つは基本的に、Python モジュールをロードして特定の関数を実行し、キーワード引数を渡すだけです。PyObjC では、これは非常に顕著でした。

ただし、Python C API を使用して同じことを行う方法がわかりません。特に、NSDictionary (整数、文字列、ブール値、または上記のすべてを保持する可能性がある) を、Python にキーワード引数として渡すことができる形式に変換する最善の方法がわかりません。

このようなことを達成する方法についての指針はありますか? 前もって感謝します!

編集: 明確にするために、以前は Python だった既存のクラスを Objective-C に変換しています。Objective-C の NSDictionary から Python 辞書を呼び出すときに渡すことができる方法を理解するのに苦労しています。残りの Python スクリプト。Objective-C クラスは基本的に単なる Python ローダーですが、私は Python C API に慣れておらず、参考になる例や関数をどこで探すべきかを理解するのに苦労しています。

4

1 に答える 1

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 リファレンス マニュアルをまだ読んでいない場合は、こちらもご覧になることをお勧めします。

于 2009-09-20T00:38:54.163 に答える