/ /正しい方法で、型クラス(“ type”)の引数を記述するための型ヒント/総称を使用 - python、python-3.x、総称、型付け

Python、Python-3.x、generics、typingの型の引数( "type")を記述するのに正しい型のヒント/ジェネリックを使用する

これは次のようになります。 型ヒント:型クラスの引数しかし、そこで認められている答えは実際には私の質問に答えないので、おそらく質問は間違って表現されていました(?)

私は[IDEがサポートしている]型ヒントから大きな恩恵を受けるシリアル化/逆シリアル化フレームワークを持っています。 APIは次のようになります。

def serialize(obj:BaseModel) -> Dict[str,Any]:
""" Serialize the object to a dictionary. """

def deserialize(data:Dict[str,Any], clazz:type) -> BaseModel:
""" Deserialize dictionary into a model object of type clazz. """

直列化方法は問題ありませんが、逆シリアル化タイプのヒントは最適ではありません。 deserializeの戻り値がtypeのオブジェクトになることを示したい clazz (これは、 BaseModel)この 思われる ジェネリックが助けることができる何かのように、しかし私は欲しいものを表現する方法がわからない。

T = TypeVar("T", bound=BaseModel)

def deserialize(data:Dict[str,Any], clazz:T) -> T:
""" Deserialize dictionary into a model object of type clazz. """

clazzは クラス TではなくTから派生 オブジェクト タイプTの(インスタンス)

私は「読みましたが、まだ読んでいません」答え(これはこの特定の問題をGoogleで処理するのにも難しいです。)ここで見逃している明らかな何かはありますか、それともpython 3.5の入力モジュールでサポートされていないのですか?

私は、型を推論するための私のツーリングのなすがままになっていることを認めた、しかしこれをする正しい方法があるならばうまくいけば、それは型チェックユーティリティによって実行されるであろう。

回答:

回答№1は2

クラスはそれ自身のインスタンスとインスタンスを返す呼び出し可能オブジェクトと考えることができるので、多分あなたは試してみることができます:

T = TypeVar("T", bound=BaseModel)

def deserialize(data: Dict[str, Any], clazz: Callable[..., T]) -> T:
""" Deserialize dictionary into a model object of type clazz. """

省略記号(...)は、クラスのコールシグネチャが指定されていないことを意味します。未指定の引数を取り、のインスタンスを返す呼び出し可能オブジェクト T.


回答№2の場合は0

あなたはPythonと型チェッカーの間の接続を切ることで少し巧妙になるかもしれません:

T = TypeVar("T", bound=BaseModel)

def deserialize(etc, T:type) -> T:

その後、 T パラメータ名と戻り型の両方です。私はあなたのIDEがこれを達成するのに十分スマートであるかどうか、またはそれを再送するのに十分怒っているかどうか知りません;-)