たとえば、次のようなコードがあります。
from typing import Type, TypeVar, cast
class SuperClass:
pass
T = TypeVar('T', bound=SuperClass)
def cast_to(obj: SuperClass, cast_to: Type[T] = SuperClass) -> T:
return cast(cast_to, obj)
そして、私はそれをに保存しましたtype_check.py
。mypyを実行すると、次のエラーメッセージが表示されます。
type_check.py:10: error: Incompatible default for argument "cast_to" (default has type "Type[SuperClass]", argument has type "Type[T]")
type_check.py:11: error: Invalid type "cast_to"
私の理解からbound
でTypeVar
、限りT
のサブクラスであるSuperClass
、それは問題ないはずです。しかし、なぜmypyがここでエラーをスローしているのでしょうか。ありがとう!
コードには2つの問題があります。最初にcast_to
関数のシグネチャは次のようになります。
def cast_to(obj: SuperClass, cast_to: Type[T] = Type[SuperClass]) -> T:
次に、あなたのcast
ステートメントで、の最初の引数としてmypy
使用できるかどうかはわかりません。代わりに、次のことを試すことができます。cast_to
cast
def cast_to(obj: SuperClass, cast_to: Type[T]) -> T:
return cast(T, obj)
もちろん、この定義cast_to
では、1つの引数だけで呼び出すことはできません。
私は今尋ねるつもりです:なぜあなたはこれをする必要があると思いますか?あなたのデザインは良いですか?cast
非常に特殊な場合に使用する必要があります。ドキュメントには次のように記載されています。
キャストは、偽のタイプチェッカーの警告を消し、何が起こっているのか完全に理解できないときにタイプチェッカーに少し助けを与えるために使用されます。
したがって、ここでデザインに真剣に質問する必要があります。あなたが達成しようとしていることについてもう少し情報を教えてください。たぶん、あなたがやろうとしていることよりも優れた、よりクリーンなデザインがあるでしょう。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加