A natureza dinâmica do Python e o suporte para digitação de pato são elogiados há muito tempo por sua flexibilidade. No entanto, à medida que as bases de código ficam maiores e mais complexas, os benefícios da verificação de tipo estático tornam-se cada vez mais aparentes. Mas como podemos conciliar a flexibilidade da digitação com pato com a segurança da verificação estática de tipos? Entre na classe Protocolo do Python.
Neste tutorial, você aprenderá:
Duck Typing é um conceito de programação em que o tipo ou classe de um objeto é menos importante do que os métodos que ele define. É baseado na ideia de que "Se parece um pato, nada como um pato e grasna como um pato, então provavelmente é um pato."
Em Python, a digitação duck é totalmente suportada. Por exemplo:
class Duck: def quack(self): print("Quack!") class Person: def quack(self): print("I'm imitating a duck!") def make_it_quack(thing): # Note: No type hint here thing.quack() duck = Duck() person = Person() make_it_quack(duck) # Output: Quack! make_it_quack(person) # Output: I'm imitating a duck!
Neste exemplo, make_it_quack não se importa com o tipo de coisa. Só importa que essa coisa tenha um método charlatão. Observe que não há dica de tipo para o parâmetro thing, o que é típico em código digitado em pato, mas pode levar a problemas em bases de código maiores.
A digitação Duck oferece diversas vantagens:
No entanto, também tem algumas desvantagens:
Uma abordagem para resolver esses problemas é usar Abstract Base Classes (ABCs). Aqui está um exemplo:
from abc import ABC, abstractmethod class Quacker(ABC): @abstractmethod def quack(self): pass class Duck(Quacker): def quack(self): print("Quack!") class Person(Quacker): def quack(self): print("I'm imitating a duck!") def make_it_quack(thing: Quacker): thing.quack() duck = Duck() person = Person() make_it_quack(duck) make_it_quack(person)
Embora essa abordagem forneça melhor verificação de tipo e interfaces mais claras, ela tem desvantagens:
Python 3.8 introduziu a classe Protocol, que nos permite definir interfaces sem exigir herança. Veja como podemos usá-lo:
from typing import Protocol class Quacker(Protocol): def quack(self):... class Duck: def quack(self): print("Quack!") class Person: def quack(self): print("I'm imitating a duck!") def make_it_quack(thing: Quacker): thing.quack() duck = Duck() person = Person() make_it_quack(duck) make_it_quack(person)
Vamos detalhar isso:
Essa abordagem nos oferece vários benefícios:
Aqui está um exemplo mais complexo mostrando como os protocolos podem ser tão complexos quanto necessário (Forma), mantendo suas classes de domínio (Círculo, Retângulo) planas:
from typing import Protocol, List class Drawable(Protocol): def draw(self): ... class Resizable(Protocol): def resize(self, factor: float): ... class Shape(Drawable, Resizable, Protocol): pass def process_shapes(shapes: List[Shape]): for shape in shapes: shape.draw() shape.resize(2.0) # Example usage class Circle: def draw(self): print("Drawing a circle") def resize(self, factor: float): print(f"Resizing circle by factor {factor}") class Rectangle: def draw(self): print("Drawing a rectangle") def resize(self, factor: float): print(f"Resizing rectangle by factor {factor}") # This works with any class that has draw and resize methods, # regardless of its actual type or inheritance shapes: List[Shape] = [Circle(), Rectangle()] process_shapes(shapes)
Neste exemplo, Circle e Rectangle não herdam de Shape ou de qualquer outra classe. Eles simplesmente implementam os métodos necessários (desenhar e redimensionar). A função process_shapes pode funcionar com qualquer objeto que possua esses métodos, graças ao protocolo Shape.
Os protocolos em Python fornecem uma maneira poderosa de trazer digitação estática para código digitado em pato. Eles nos permitem especificar interfaces no sistema de tipos sem exigir herança, mantendo a flexibilidade da digitação duck e ao mesmo tempo adicionando os benefícios da verificação estática de tipos,
Ao usar protocolos, você pode:
Se você quiser saber mais sobre protocolos e dicas de tipo em Python, verifique a documentação oficial do Python no módulo de digitação ou explore ferramentas avançadas de verificação de tipo estático como mypy.
Boa codificação e que seus patos sempre grasnam com segurança de tipo!
Você pode encontrar mais do meu conteúdo, incluindo meu boletim informativo aqui
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3