decorator

keywords: python decorator

装饰器在 Python 中是非常有特点, 也非常有用的语法, 能大幅减少代码重复, 并且让代码更加易维护.

标准的 decorator 的实现会比较难, 首先你需要对于内部函数外部函数加很多 wrapper, 并且还要更新很多 function 本身的属性, 还可能丢失参数定义和类型信息, 可能还要对被装饰的函数按照 类, 方法, 函数 做区分. 很少有人能写出正确的装饰器实现. decorator 这个库可以让你写出来的装饰器更容易符合你的需求.

pip install decorator

还有另一个用于写 decorator 的包 wrapt, 效果类似.

Examples

# -*- coding: utf-8 -*-

import decorator


@decorator.decorator
def before_and_after(func, *args, **kwargs):
    print("before")
    result = func(*args, **kwargs)
    print("after")
    return result


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

    @before_and_after
    def say_hello(self):
        print(f"say_hello: Hello {self.name}")

    @property
    @before_and_after
    def greeting(self):
        print(f"greeting: Greating {self.name}")
        return None


user = User(name="Alice")

user.say_hello()
user.greeting
# -*- coding: utf-8 -*-

import decorator


@decorator.decorator
def before_and_after(func, *args, **kwargs):
    print("before")
    result = func(*args, **kwargs)
    print("after")
    return result


@before_and_after
def add_two(first: int, second: int) -> int:
    return first + second


# Looks like in PyCharm the signature not working
result = add_two(first=1, second=2)
assert result == 3