Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

316
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda