Interfaces de Python: elija protocolos sobre ABC
Varias razones prácticas para preferir nuevos protocolos brillantes
Usé una biblioteca Python estándar abcpara definir interfaces durante los últimos 10 años de mi carrera. Pero recientemente, descubrí que los protocolos de Python relativamente nuevos son mucho mejores. La gente encuentra usos para ambas tecnologías. Pero quiero convencerte de que saltes por completo de los barcos y empieces a usarlos en lugar de técnicas más tradicionales.
Interfaces de Python: ¿qué puedes usar?
Python es algo diferente de otros lenguajes populares ya que no hay interfaces a nivel de lenguaje. Pero hay varias implementaciones de biblioteca. El abcpaquete es probablemente el más popular:
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def eat(self, food) -> float:
pass
@abstractmethod
def sleep(self, hours) -> float:
pass
from zope.interface import Interface
class Animal(Interface):
def eat(self, food) -> float:
pass
def sleep(self, hours) -> float:
pass
Por último, existen protocolos:
from typing import Protocol
class Animal(Protocol):
def eat(self, food) -> float:
...
def sleep(self, hours) -> float:
...
¿Qué debes usar?
Debe saber que un sistema de interfaz no se localizará en una pequeña parte de su base de código. Después de elegir uno, lo verá en todas partes y será difícil cambiarlo en el futuro. Por lo tanto, descartaría de inmediato cualquier implementación personalizada o Zope. Es una dependencia adicional con la que debe lidiar para siempre: instalación, versiones, soporte, etc. Por ejemplo, debe instalar un complemento Mypy para admitir un zope.interfacepozo. Además, es posible que un nuevo desarrollador del equipo no conozca este paquete personalizado y tendrá que explicarle qué es y por qué lo eligió.
La batalla principal ocurrirá entre abcy Protocols. Pero si realmente quieres una batalla zopevs Protocols, lee este análisis detallado .
Comprobación estática primero
La gran suposición que voy a hacer es que ya está convencido de que la verificación estática es imprescindible : no va a ejecutar el código que falla pylint/mypy. Ambas damas apoyan abce Protocolsigualmente bien. Además, solo sepa que ambos abcy Protocolspermiten la verificación en tiempo de ejecución, en caso de que lo necesite.
Ambos admiten sintaxis explícita.
Primero, tenga en cuenta que aún puede heredar explícitamente de an abc y a Protocol. Muchos argumentos en un muy buen video (y comentarios) de Arjan giran en torno a la idea errónea de que no se puede hacer eso con los protocolos. Totalmente puedes:
class Giraffe(Animal):
...
class Giraffe: # no base class needed!
def eat(self, food) -> float:
return 0.
def sleep(self, hours) -> float:
return 1.
def feed_animal(animal: Animal):
...
giraffe = Giraffe()
feed_animal(giraffe)
abctambién soportan interfaces implícitas a través del concepto de “ subclases virtuales ”. Pero tienes que llamar registerpara cada implementación:
class Giraffe: # no base class needed!
def eat(self, food) -> float:
return 0.
class Animal(ABC):
...
Animal.register(Giraffe) # achieves the same as implicit Protocol
Los protocolos le permiten definir una interfaz para una función (no solo una clase); consulte los protocolos de devolución de llamada . Es una característica muy interesante que merece una publicación aparte.
Ambos admiten métodos predeterminados (desafortunadamente)
Hay una gran desventaja para ambos abcy Protocols. En el mundo real, muchas personas trabajan en una sola base de código. Las clases base abstractas a veces tienden a adquirir implementaciones de métodos predeterminados. Esto es lo que podría parecer:
class Animal(Protocol): # the same holds for Animal(ABC):
def eat(self, food) -> float:
... # this is still abstract
def sleep(self, hours) -> float:
return 3.
Los protocolos son más cortos
Por último, pero no menos importante, puede contar la cantidad de líneas de código que necesita para definir una interfaz. Con abc, debe tener un abstractmethoddecorador para cada método. Pero con Protocolos sin verificación de tiempo de ejecución, no tiene que usar ningún decorador. Así que aquí, los protocolos ganan sin duda alguna.
Conclusión
Sumemos las puntuaciones:
Con suerte, no me estoy perdiendo nada importante en este análisis. Mirando los resultados, el equipo "Protocolos" gana, ¡y probablemente deberías comenzar a usarlo!
Si te ha resultado útil este artículo, dame algunos aplausos. ¡Gracias por leer!
Puedes encontrarme en LinkedIn o Twitter .
Recursos
- Wiki de tipeo de patos
- Buen tutorial de tipeo de patos de Taylor Manderson
- Una comparación similar entre Zope y Protocols de Glyph
- Comparación ABC vs Protocolos de Arjan
- Interfaces funcionales con protocolos de devolución de llamada
Codificación de nivel superior
¡Gracias por ser parte de nuestra comunidad! Antes de que te vayas:
- Aplaude la historia y sigue al autor
- Ver más contenido en la publicación Level Up Coding
- Síguenos: Twitter | LinkedIn | Boletin informativo

![¿Qué es una lista vinculada, de todos modos? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































