Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

315
Vistas
Tipo genérico de Python que implementa el protocolo.

Los objetos A, B... tienen espacio de namespace de atributo y tengo una función que filtra una lista de tales objetos por un determinado conjunto de valores de atributo de namespace de nombres:

 T = TypeVar('T') def filter(seq: list[T], namespace_values: set[str]) -> list[T]: # Returns a smaller list containing only the items from # `seq` whose `namespace` are in `namespace_values` ...

Esto funciona bien, pero permite pasar un objeto de tipo X que no tiene el espacio de namespace del atributo sin ningún error de verificación.

Luego creé un protocolo y cambié la función para usar el protocolo:

 class Namespaced(Protocol): namespace: str def filter(seq: list[Namespaced], namespace_values: set[str]) -> list[Namespaced]: # Returns a smaller list containing only the items from # `seq` whose `namespace` are in `namespace_values` ...

Ahora me sale un error de verificación si paso una lista de X (que es lo que quería), pero perdí los genéricos:

 list_of_a: list[A] = [a1, a2, a3] output = filter(list_of_a, ['ns1', 'ns2']) # output is list[Namespaced] instead of list[A]

¿Cómo puedo combinar los genéricos y el protocolo para que mi función devuelva una lista de tipo T y también verifique que los elementos de seq implementen el protocolo Namespaced ?

Intenté el siguiente enfoque pero la T se perdió.

 def filter(seq: list[Namespaced[T]], namespace_values: set[str]) -> list[T]: # Returns a smaller list containing only the items from # `seq` whose `namespace` are in `namespace_values` ...

¡Salud!

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Utilice una variable de tipo enlazado con el protocolo como enlace. Considere el siguiente módulo:

 (py39) Juans-MacBook-Pro:~ juan$ cat test.py

Que tiene:

 from typing import TypeVar, Protocol from dataclasses import dataclass class Namespaced(Protocol): namespace: str T = TypeVar("T", bound="Namespaced") @dataclass class Foo: namespace: str @dataclass class Bar: namespace: str id: int def frobnicate(namespaced: list[T]) -> list[T]: for x in namespaced: print(x.namespace) return namespaced result1 = frobnicate([Foo('foo')]) result2 = frobnicate([Bar('bar', 1)]) reveal_type(result1) reveal_type(result2)

Entonces mypy da:

 (py39) Juans-MacBook-Pro:~ juan$ mypy --strict test.py test.py:27: note: Revealed type is "builtins.list[test.Foo*]" test.py:28: note: Revealed type is "builtins.list[test.Bar*]"
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda