Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

99
Views
Cómo crear alias de tipos genéricos para decoradores

Considere el ejemplo de un decorador con tipo vinculado a ciertas clases .

 import unittest from typing import * T = TypeVar("T", bound=unittest.TestCase) def decorate(func: Callable[[T], None]) -> Callable[[T], None]: def decorated_function(self: T) -> None: return func(self) return decorated_function

Ahora incluso tengo un generador que crea estos decoradores y quiero abreviar estos decoradores. Qué tipo le hago a las variables variables que almacena el decorador (ejemplo simplificado omitiendo el generador).

 my_decorate: Callable[[Callable[[T], None]], Callable[[T], None]] = decorate

Esto funciona, pero es torpe. Entonces la pregunta es:

¿Cómo puedo crear un alias de este tipo para evitar tener que escribir la firma completa?


Cosas que no funcionan:

 TD = Callable[[Callable[[T], None]], Callable[[T], None]] my_decorate: TD[T] = decorator_variable

da el error

 error: Type variable "mypytest.T" is unbound note: (Hint: Use "Generic[T]" or "Protocol[T]" base class to bind "T" inside a class) note: (Hint: Use "T" in function signature to bind "T" inside a function)

Por el contrario, puedo usar TD[T] como tipo de argumento para una función.

Simplemente usando my_decorate: TD = ... produce un error --strict

 error: Missing type parameters for generic type "TD"

Y ya no detecta aplicaciones incorrectas de my_decorate .

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

¿Qué pasa con esto? Es más corto que la firma completa:

 import unittest from typing import * T = TypeVar("T", bound=unittest.TestCase) def decorate(func: Callable[[T], None]) -> Callable[[T], None]: def decorated_function(self: T) -> None: return func(self) return decorated_function decorator_variable: Callable[[Callable[[T], None]], Callable[[T], None]] = decorate U = Callable[[T], None] my_decorate: Callable[[U[T]], U[T]] = decorator_variable
over 4 years ago · Santiago Trujillo Report

0

Como en muchos casos, cuando Callable es demasiado limitado, use un Protocol en su lugar:

 class TD(Protocol): """Type of any callable `(T -> None) -> (T -> None)` for all `T`""" def __call__(self, __original: Callable[[T], None]) -> Callable[[T], None]: ...

TD no es un tipo genérico y, por lo tanto, no necesita "rellenar" una variable de tipo. Se puede utilizar directamente como una anotación:

 my_decorate: TD = decorate

En particular, TD.__call__ sigue siendo un invocable genérico a pesar de que TD no es genérico. Su T se llena con el contexto de cada llamada según se desee.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!