Escriba sugerencias con clases definidas por el usuario

103

Parece que no pude encontrar una respuesta definitiva. Quiero hacer una sugerencia de tipo para una función y el tipo es una clase personalizada que he definido, la llamé CustomClass().

Y luego digamos que en alguna función, llámala FuncA(arg), tengo un argumento llamado arg. ¿Sería la forma correcta de escribir sugerencia FuncA:

def FuncA(arg: CustomClass):

O sería:

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

hhprogram
fuente

Respuestas:

125

Lo primero es correcto , si argacepta una instancia deCustomClass :

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

En caso de que desee la clase en CustomClasssí (o un subtipo) , debe escribir:

from typing import Type  # you have to import Type

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

Como está escrito en la documentación sobre mecanografía :

class typing.Type(Generic[CT_co])

Una variable anotada con Cpuede aceptar un valor de tipo C. Por el contrario, una variable anotada con Type[C]puede aceptar valores que son clases en sí mismas ; específicamente, aceptará el objeto de clase deC .

La documentación incluye un ejemplo con la intclase:

a = 3         # Has type 'int'
b = int       # Has type 'Type[int]'
c = type(a)   # Also has type 'Type[int]'
Willem Van Onsem
fuente
1
¿Es Typede py3.6 y más allá? Solo obtengo un NameError.
cs95
3
Tenga en cuenta que si tiene la clase en el mismo archivo, debe existir en el momento en que se evalúa la sugerencia de tipo ...
576i
13
@ 576i: iirc, también puede usar una cadena. Entonces def foo(bar: 'Qux')es equivalente a def foo(bar: Qux)excepto que no requiere cargar el tipo inmediatamente.
Willem Van Onsem
2
@willem gracias - No sabía eso. Lo que es mejor, el autocompletado de Pycharm todavía funciona.
576i
3
@ cs95 Sí. Todas las sugerencias de tipo son +3,7.
Thiras