COMはPythonでオブジェクトのためのヒンティングの正しい種類は何ですか?

トム・ピック:

私は、サードパーティのソフトウェアにプログラム可能なインターフェイスを公開するためのpython内のCOMオブジェクトを使用しています。これは、使用によって達成されるDispatchからwin32com.client私のプロジェクトでは、しかし、私はあなたがタイプヒンティングの目的でこれらのCOMオブジェクトのタイプを定義する方法などわからないよ、python.3.7からヒンティングのタイプを利用してきました。質問は、実際の例では、Microsoft Direct Xのレコードであると私が持っているすべてのCOMオブジェクトに関する:Dispatch("ADODB.Recordset")

from win32com.client import Dispatch
def create_my_com_object_instance(input_arg: Dict[str, Union[str, float, int]]) -> <type_of_com_object_here>:
    my_instance = Dispatch("ADODB.Recordset")
    # Set attributes/call methods of this instance here ... 
    return my_instance

上記のコードでは、私はCOMオブジェクトタイプと「type_of_com_object_here」を置き換えますスニペット。

私が最初に考えただけで呼び出すようにしたtype()インスタンス上で、返されたタイプを使用します。

x = Dispatch("ADODB.Recordset")
x
Out[1]: <win32com.gen_py.Microsoft ActiveX Data Objects 6.1 Library._Recordset instance at 0x83848456>
type(x)
Out[2]: win32com.gen_py.B691E011-1797-432E-907A-4D8C69339129x0x6x1._Recordset._Recordset
x.__class__
Out[3]: win32com.gen_py.B691E011-1797-432E-907A-4D8C69339129x0x6x1._Recordset._Recordset

これは、COMオブジェクトを定義するのに適したタイプを返しません。私は私が使用して抽象基本クラスを作成することができると信じているTypeVar('T')Generic[]私はわからないよしかし、利用できるより良い代替/もっとニシキヘビがある場合は、。

感謝

Michael0x2a:

私はあなたが、残念ながらPythonでタイピングの限界の一つに実行しているんです。特に:

  1. 私の知る限り承知しているとして、Typeshedまたはサードパーティのモジュールとしてのいずれかでpywin32ライブラリにはタイプスタブはありません。この意味することはタイプがあるべきための既存の標準的な言及はありません。
  2. 動的に任意のオブジェクトへの派遣は、ちょうど(と仮定してヒントを入力使用して表現することが可能です何の限界を株に起こっているDispatch、本当に任意のオブジェクトへの派遣を行います)。

だから、私は、次の3つのいずれかの方法をお勧めします。

  1. あなたが返されるタイプについて全く何も負いませんし、ちょうど不透明なブロブとしてそれを扱いたい場合は、戻り値の型だけでも持っていますobjectPEP 484準拠したタイプチェッカーは、発信者にのみ、すべてのPythonで存在しているメソッドを使用できるようになるので、これは、最も制限され、安全なオプションを入力するなど、オブジェクト__str__または__eq__

  2. あなたが返されるタイプについて全く何も負いませんが、また、それの使用に制限を課していないしたい場合は、戻り値の型があること持っている任意の、ダイナミックなタイプを。これは、ほとんど許容し、危険な操作です:あなたは、出力は、いくつかの動的な型であると言って、発信者の使用に返されたオブジェクトをしかし、彼らがしてください聞かせするタイプチェッカーを語っています。

    これはいわば、「デフォルトのオプション」である:pywin32のために利用可能なタイプスタブがないため、型チェッカーは、バック仮定に落ちるDispatch(...)任意の戻り値の型を持っています。

  3. 返されるタイプは、常にいくつかの特定のメソッドを持っているか、使用可能な属性になる特定のためにあなたが知っている場合は、戻り値の型があること持っているプロトコルプロトコルは基本的にあなたがやらせる構造的サブタイプを:プロトコルメソッドと属性を実装するために起こる任意のクラスは、クラスがどのような方法で、プロトコルから継承されていない場合でも、そのプロトコルのサブタイプと考えられています。あなたが行くに精通している場合のプロトコルは、ゴーのインターフェイスのように基本的にあります。

    あなたは、専用作成する場合がありcreate_adodb_recordset(...)ますが、より完全に戻り値の型をカスタマイズすることができますので、ここでは機能し。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=15740&siteId=1