Patch de Macaco Python

Resumo : neste tutorial, você aprenderá o conceito de monkey patching em Python, quando usá-lo e como aplicá-lo de forma eficaz.

Introdução ao patch de macaco Python

Monkey patching é uma técnica que permite modificar ou estender o comportamento de módulos , classes ou funções existentes em tempo de execução sem alterar o código-fonte original.

Aplicando patch de macaco

Para aplicar a técnica de patch de macaco, siga estas etapas:

  • Primeiro, identifique o destino que pode ser um módulo, classe, método ou função que você deseja corrigir.
  • Segundo, crie seu patch escrevendo código para adicionar, modificar ou substituir a lógica existente.
  • Terceiro, aplique o patch usando uma atribuição para aplicá-lo ao destino. O patch substituirá ou estenderá o comportamento existente.

Embora o monkey patching seja uma ferramenta poderosa, você deve usá-la com cuidado para evitar comportamentos inesperados.

Exemplo de patch de macaco

Suponha que você tenha MyClassuma classe que possui apenas um __init__()método:

class Robot:
    def __init__(self, name):
        self.name = nameLinguagem de código:  Python  ( python )

Para estender o comportamento da Robotclasse em tempo de execução sem alterá-la Robot, você pode usar a técnica de monkey patching.

Imagem que você precisa para estender um comportamento que permita que as instâncias do Robô falem. Aqui estão as etapas para fazer isso:

Primeiro, defina uma função chamada add_speechque aceite uma classe como parâmetro:

def add_speech(cls):
    cls.speak = lambda self, message: print(message)
    return clsLinguagem de código:  Python  ( python )

A add_speech()função adiciona o speak()método adicionando um atributo speak à clsclasse e atribuindo uma expressão lambda e retornando a classe. A expressão lambda aceita uma mensagem e a exibe no console.

Segundo, corrija a Robotclasse passando-a para o add_speech()método:

Robot = add_speech(Robot)Linguagem de código:  Python  ( python )

Após esta linha de código, a Robotclasse terá o speak()método.

Observe que você pode usar a add_speech()função para corrigir qualquer classe, não apenas a Robotclasse.

Terceiro, crie uma nova instância da classe Robot e chame o speak()método:

robot = Robot('Optimus Prime')
robot.speak('Hi')Linguagem de código:  Python  ( python )

Junte tudo:

def add_speech(cls):
    cls.speak = lambda self, message: print(message)
    return cls


class Robot:
    def __init__(self, name):
        self.name = name


Robot = add_speech(Robot)

robot = Robot('Optimus Prime')
robot.speak('Hi')HiLinguagem de código:  Python  ( python )

Se você executar o programa, verá a seguinte saída:

HiLinguagem de código:  Python  ( python )

Como esta linha de código é um decorador:

Robot = add_speech(Robot)Linguagem de código:  Python  ( python )

você pode removê-lo e usar a sintaxe do decorador :

@add_speech
class Robot:
    def __init__(self, name):
        self.name = nameLinguagem de código:  Python  ( python )

O novo código ficará assim:

def add_speech(cls):
    cls.speak = lambda self, message: print(message)
    return cls


@add_speech
class Robot:
    def __init__(self, name):
        self.name = name


robot = Robot('Optimus Prime')
robot.speak('Hi')Linguagem de código:  Python  ( python )

Quando usar patch de dinheiro

Na prática, você deve usar o monkey patch somente quando necessário, pois pode dificultar a compreensão e a depuração do código.

Por exemplo, se você usa uma biblioteca de terceiros e ela tem um bug urgente que você não pode esperar pelo lançamento oficial. Nesse caso, você pode usar o monkey patching para aplicar correções rápidas enquanto espera por uma solução adequada.

Outro cenário é que você deseja adicionar funcionalidade a classes que não controla e não pode usar outras técnicas como herança ou composição. O monkey patching é útil neste caso.

Na prática, você encontrará monkey patching na biblioteca simulada, como o unittest.mockmódulo padrão. O unittest.mockmódulo possui patch()um método que substitui temporariamente um alvo por um objeto simulado.

Resumo

  • A técnica de monkey patching em Python permite modificar ou estender dinamicamente o código existente em tempo de execução sem alterar o código original.
  • Use a técnica de patch de macaco se tiver um bom motivo para fazê-lo.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *