Введіть підказки з визначеними користувачем класами


103

Не вдалося знайти остаточної відповіді. Я хочу зробити підказку типу для функції, а тип - це якийсь спеціальний клас, який я визначив, назвав його CustomClass().

І тоді, скажімо, у якійсь функції, назвіть це FuncA(arg), у мене є один аргумент 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може приймати значення типу 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.
Тірас,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.