4
4

2 に答える 2

5

この質問は古いので、今までに整理したかどうかはわかりませんが、まだ答えていません。少し前に、Obj-C から Python にパラメーターを取得することに悩まされていました。必ず試して検討する必要があることがいくつかあります。

まず最も簡単なのは、Python で実装された Objective-C でそのスタブを作成する場合、(NSError **)outパラメーターであることを指定する必要があるということです。

@interface MyObject : NSObject
- (BOOL)testMethod:(out NSError **)error;
@end

これを使用して、Python からカスタム Obj-C メソッドを呼び出すことに成功しました。そうしないと、Python 側が適切なメタデータを取得できないと思います。

signaturePython メソッド定義にデコレータを追加することもあります。パラメータの 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 メーリング リストスレッドで見つけました。

于 2011-03-11T09:40:03.997 に答える
4

私はこれを試しましたが、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 に深く関わってからしばらく経ちました)

于 2010-12-04T21:19:10.483 に答える