Типовые подсказки с пользовательскими классами

109

Не могу найти однозначного ответа. Я хочу сделать подсказку типа для функции, и тип, являющийся некоторым настраиваемым классом, который я определил, назвал его CustomClass().

А затем, скажем, в какой-то функции вызовите ее FuncA(arg), у меня есть один аргумент с именем arg. Правильный ли способ ввода подсказки FuncA:

def FuncA(arg: CustomClass):

Или это было бы:

def FuncA(Arg:Type[CustomClass]):?

hhprogram
источник

Ответы:

131

Первое верно , если 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может принимать значение типа 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
Это Typeот py3.6 и выше? Я просто получаю NameError.
cs95
3
Обратите внимание, что если у вас есть класс в том же файле, он должен существовать во время оценки подсказки типа ...
576i
13
@ 576i: iirc, вы также можете использовать строку. Так def foo(bar: 'Qux')эквивалентно, за def foo(bar: Qux)исключением того, что не требует немедленной загрузки типа.
Виллем Ван Онсем
2
@willem спасибо - я этого не знал. Что лучше, автозаполнение pycharm все еще работает ..
576i
3
@ cs95 Да. Все подсказки типа +3,7.
thiras