Parece que no se pudo 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 en alguna función, FuncA(arg) , tengo un argumento llamado arg . ¿Sería la forma correcta de escribir la sugerencia FuncA :
def FuncA(arg: CustomClass):O sería:
from typing import Type def FuncA(Arg:Type[CustomClass]):Lo primero es correcto , si arg acepta una instancia de CustomClass :
def FuncA(arg: CustomClass): # ^ instance of CustomClass En caso de que desee la clase CustomClass en sí misma (o un subtipo) , debe escribir:
from typing import Type # you have to import Type def FuncA(arg: Type[CustomClass]): # ^ CustomClass (class object) itselfComo está escrito en la documentación sobre Typing :
class typing.Type(Generic[CT_co])Una variable anotada con
Cpuede aceptar un valor de tipoCPor el contrario, una variable anotada conType[C]puede aceptar valores que son clases en sí mismos ; específicamente, aceptará el objeto de clase deC.
La documentación incluye un ejemplo con la clase int :
a = 3 # Has type 'int' b = int # Has type 'Type[int]' c = type(a) # Also has type 'Type[int]'
La respuesta de Willem Van Onsem es, por supuesto, correcta, pero me gustaría ofrecer una pequeña actualización. En PEP 585 , se introdujeron los genéricos de sugerencias de tipo en las colecciones estándar. Por ejemplo, mientras que anteriormente teníamos que decir, por ejemplo,
from typing import Dict foo: Dict[str, str] = { "bar": "baz" } ahora podemos renunciar a la jerarquía de tipos paralelos en el módulo de typing y simplemente decir
foo: dict[str, str] = { "bar": "baz" } Esta característica está disponible en python 3.9+, y también en 3.7+ si se usa from __future__ import annotations .
En términos de esta pregunta específica, significa que en lugar de from typing import Type , ahora podemos simplemente anotar clases usando el type incorporado:
def FuncA(arg: type[CustomClass]):