Digite dicas com classes definidas pelo usuário

103

Não foi possível encontrar uma resposta definitiva. Eu quero fazer uma dica de tipo para uma função e o tipo sendo alguma classe personalizada que eu defini, chamei-a CustomClass().

E então digamos que em alguma função, chame-a FuncA(arg), eu tenho um argumento chamado arg. A maneira correta de digitar a dica FuncAseria:

def FuncA(arg: CustomClass):

Ou seria:

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

hhprogram
fonte

Respostas:

125

O primeiro está correto , se argaceita uma instância deCustomClass :

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

Caso queira a própria classe CustomClass(ou um subtipo) , você deve escrever:

from typing import Type  # you have to import Type

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

Como está escrito na documentação sobre Digitação :

class typing.Type(Generic[CT_co])

Uma variável anotada com Cpode aceitar um valor do tipo C. Em contraste, uma variável anotada com Type[C]pode aceitar valores que são classes em si - especificamente, ela aceitará o objeto de classe deC .

A documentação inclui um exemplo com a intclasse:

a = 3         # Has type 'int'
b = int       # Has type 'Type[int]'
c = type(a)   # Also has type 'Type[int]'
Willem Van Onsem
fonte
1
É Typede py3.6 e além? Acabei de receber um NameError.
cs95 de
3
Observe que se você tiver a classe no mesmo arquivo, ela precisa existir no momento em que a dica de tipo é avaliada ...
576i
13
@ 576i: iirc, você também pode usar uma string. Portanto, def foo(bar: 'Qux')é equivalente a, def foo(bar: Qux)exceto que não requer o carregamento do tipo imediatamente.
Willem Van Onsem
2
@willem thanks - Eu não sabia disso. O que é melhor, o preenchimento automático do pycharm ainda funciona.
576i
3
@ cs95 Sim. Todas as dicas de tipo são +3,7.
thiras