2 に答える
この質問は古いので、今までに整理したかどうかはわかりませんが、まだ答えていません。少し前に、Obj-C から Python にパラメーターを取得することに悩まされていました。必ず試して検討する必要があることがいくつかあります。
まず最も簡単なのは、Python で実装された Objective-C でそのスタブを作成する場合、(NSError **)
がout
パラメーターであることを指定する必要があるということです。
@interface MyObject : NSObject
- (BOOL)testMethod:(out NSError **)error;
@end
これを使用して、Python からカスタム Obj-C メソッドを呼び出すことに成功しました。そうしないと、Python 側が適切なメタデータを取得できないと思います。
signature
Python メソッド定義にデコレータを追加することもあります。パラメータの 1 つが sig の out パラメータであることを指定できます。このPyObjC docに詳細が記載されています。
@objc.signature('@@:io^@')
もう 1 つのことは (そして、これまでに自分でこれを理解しているかもしれません)、Objective-C スタブを実行したくない場合は、独自のメタデータを生成し、.bridgesupport ファイルを事業。私が確信していない唯一のこと (大きなこと!) は、このファイルが実際に読み取られることを確認する方法です。メタデータ自体は非常に簡単に記述できます。Apple は gen_bridge_metadata というコマンドライン ユーティリティを提供しており、手動で行うことができます (/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python を参照)。 /PyObjC/AppKit/PyObjC.bridgesupport)。そのユーティリティのman ページman 5 BridgeSupport
があり、参考になります。読むべきもう 1 つの Apple ドキュメントは、Generating Framework Metadataです。
将来の読者のために更新objc.registerMetaDataForSelector
: 関数とを見つけましたobjc.parseBridgeSupport
。どちらも、Python dicts (前者の関数) または BridgeSupport のマニュアル ページに記載されている XML 形式 (後者) を使用して、メソッドのメタデータを追加できます。使用例は、 pyobjc/pyobjc-core/PyObjCTest/test_metadata*registerMetaData...
の pyobjc ソースで入手できます。これは、この pyobjc-dev メーリング リストスレッドで見つけました。
私はこれを試しましたが、ObjC から呼び出したときに例外が発生しました (: depythonifying 'char', got 'tuple')。
PyObjC は通常、タプルの 2 番目の要素としてエラーを返します。
何かのようなもの:
response, error = object.someMethod_error_(foo) # leave off the error
if not response:
# process error
あなたの更新を見た...
メタデータ ブリッジに飛び込んで、実行時に一部のメタデータを実装に適用して機能させる方法を理解する必要があります。
または、コンパイル済みの Objective-C スタブ クラスからサブクラス化する方が、はるかに簡単な場合があります。
つまり、これを試してください:
@interface AbstractFoo : NSObject
@end
@implementation AbstractFoo
- (BOOL) myMethod: (int) arg error: (NSError **) anError;
{
return YES;
}
@end
AbstractFoo
そうすれば、Python 側からサブクラス化できるはずで、「うまくいく」かもしれません。
多分。
(申し訳ありませんが、PyObjC に深く関わってからしばらく経ちました)