es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

En Python, ¿puedo reducir las propiedades definidas por el protocolo de la clase?

Déjame explicarlo con un ejemplo:

“`python
import typing as t
from dataclasses import dataclass

describe our protocols

class ID(t.Protocol):
“Este protocolo describe algún tipo de ID.”
def hash(self) -> int:
raise NotImplementedError
def eq(self, other) -> bool:
raise NotImplementedError
def str(self) -> str:
raise NotImplementedError

class ObjectWithID(t.Protocol):
“Este protocolo describe un objeto que tiene un ID.”
@property
def id(self) -> ID:
raise NotImplementedError

now describe real classes

class MyID(ID):
“Implementación del protocolo ID”
def init(self, val: int):
self.value: int = val
def hash(self) -> int:
return self.value
def eq(self, other) -> bool:
return isinstance(other, MyID) and self.value == other.value
def str(self) -> str:
return str(self.value)

@dataclass
class MyObject(ObjectWithID):
id: MyID # <<< ESTO

Ahora, PyCharm insiste en que id, siendo de tipo MyID, rompe la compatibilidad con el protocolo ObjectWithID.
Sin embargo, pylint no tiene problema con esta línea.
Tampoco yo, porque desde mi punto de vista, cualquier instancia correcta de MyObject será compatible con el protocolo ObjectWithID.

¿Quién tiene razón aquí? ¿Es seguro para mí ignorar la advertencia en PyCharm?

Puedo ver que si existiera otra implementación de ID, MyObject no la aceptaría, mientras que ObjectWithID sí podría. ¿Pero realmente es eso un problema?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La respuesta a esta pregunta es subjetiva y depende de la perspectiva del individuo. Desde un estricto cumplimiento de los protocolos de tipo, PyCharm tiene razón al indicar que el tipo de id de MyObject, siendo de tipo MyID, puede romper la compatibilidad con el protocolo ObjectWithID que espera que id sea de tipo ID. Sin embargo, desde un punto de vista práctico, siempre y cuando MyID implemente correctamente el protocolo ID, MyObject funcionará como se espera y será compatible con el protocolo ObjectWithID.

    Por lo tanto, es seguro suprimir la advertencia en PyCharm y usar MyID como el tipo para id de MyObject. Sin embargo, es importante tener en cuenta que en algunos casos puede ser necesario implementar diferentes tipos para el mismo protocolo para garantizar flexibilidad y compatibilidad.

Comments are closed.