Implementation pattern*

/* inspired by Rust

Useful when it is needed to extend a class (usually 3d party) with some methods (regular, class, or static)

Install

pip install impl_pattern

or

poetry add impl_pattern

Usage

Regular methods

from impl_pattern import impl

class Sample:
    def __init__(self):
        self.value = 10

@impl(Sample)
def plus_one(self: Sample):
    self.value += 1

s = Sample()
s.plus_one()

print(s.value) 
# 11

it works with async methods as well

from asyncio import sleep

@impl(Sample)
async def plus_one(self: Sample):
    await sleep(1)
    self.value += 1

s = Sample()
await s.plus_one()

print(s.value) 
# 11

Class methods

To register function as a classmethod you can use impl_classmethod decorator

from impl_pattern import impl_classmethod

class Sample:
    value = 10

@impl_classmethod(Sample)
def plus_one(cls):
    cls.value += 1

Sample.plus_one()

print(Sample.value) 
# 11

This works with async methods too

from asyncio import sleep

@impl_classmethod(Sample)
async def plus_one(cls):
    await sleep(1)
    self.value += 1

await Sample.plus_one()

print(Sample.value) 
# 11

Static methods

Static methods use the same syntax but with the impl_staticmethod decorator

from impl_pattern import impl_staticmethod

class Sample:
    ...

@impl_staticmethod(Sample)
def get_one():
    return 1

print(Sample.get_one()) 
# 1

This works with async methods too

from asyncio import sleep

@impl_staticmethod(Sample)
async def get_one():
    return 1

print(await Sample.get_one()) 
# 1

GitHub

View Github