ユーザー定義クラスの型ヒント


103

決定的な答えを見つけることができなかったようです。関数の型ヒントを実行したいのですが、型は、自分で定義したカスタムクラスで、それを呼び出しますCustomClass()

そして、いくつかの関数でそれを呼び出すとしましょう。FuncA(arg)私はという引数を1つ持っていますarg。ヒントを入力する正しい方法はFuncA次のとおりです。

def FuncA(arg: CustomClass):

またはそれは:

def FuncA(Arg:Type[CustomClass]):

回答:


125

前者は正しいならば、arg受け入れのインスタンスをCustomClass

def FuncA(arg: CustomClass):
    #     ^ instance of CustomClass

場合は、あなたがしたいクラスCustomClass自体(またはサブタイプ)を、あなたは書く必要があります。

from typing import Type  # you have to import Type

def FuncA(arg: Type[CustomClass]):
    #     ^ CustomClass (class object) itself

それはタイピングに関するドキュメントに書かれているように:

class typing.Type(Generic[CT_co])

注釈が付けられた変数Cは、typeの値を受け入れる場合がありますC。対照的に、アノテーションが付けられType[C]た変数、それ自体がクラスである値を受け入れる場合があります。具体的には、のクラスオブジェクトをC受け入れます

ドキュメントには、intクラスの例が含まれています。

a = 3         # Has type 'int'
b = int       # Has type 'Type[int]'
c = type(a)   # Also has type 'Type[int]'

1
あるTypepy3.6以降から?ただNameError
cs95

3
同じファイル内にクラスがある場合、型ヒントが評価されるときに存在する必要があることに注意してください...
576i

13
@ 576i:iirc、文字列も使用できます。そうdef foo(bar: 'Qux')することと等価であるdef foo(bar: Qux)ことがすぐにタイプをロードする必要がないことを除いて。
Willem Van Onsem 2017年

2
@willemありがとう-私はそれを知りませんでした。何が最善だ、pycharmの自動補完はまだ動作...
576iの

3
@ cs95はい。すべてのタイプヒントは+3.7です。
thiras
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.