#!/usr/bin/python3.7
# -*- coding: utf-8 -*-
# @Time : 2019/3/11 11:43
# @Author: Jtyoui@qq.com
from jtyoui.decorators.warn import *
import re
from jtyoui.error import CoordinateLengthNotEqualError, ParameterNotEmptyError
"""
装饰器模式
"""
[文档]@warns('也废除,请使用functools.wraps函数来替代', DeprecationWarning)
def warps(func):
"""这个装饰器等效:functools.wraps(fun)"""
def call(*args, **kwargs):
return func(*args, **kwargs)
call.__doc__ = func.__doc__
call.__name__ = func.__name__
call.__dict__.update(func.__dict__)
return call
[文档]def replace_regular(re_, replace_):
"""根据正则来修改参数
:param re_: 匹配的正则
:param replace_: 替换正则的数据
:return: 被替换完毕的参数
"""
r = re.compile(re_)
def remove_replace(fun):
@functools.wraps(fun)
def wraps(*args, **kwargs):
args_, kwargs_ = list(args), {}
for i in range(len(args)):
if isinstance(args[i], str):
args_[i] = r.sub(replace_, args[i])
else:
args_[i] = args[i]
for k, v in kwargs.items():
if isinstance(v, str):
kwargs_.setdefault(k, r.sub(replace_, v))
else:
kwargs_.setdefault(k, v)
return fun(*args_, **kwargs_)
return wraps
return remove_replace
[文档]def parameter_set_length(fun):
"""参数集合长度验证修饰器"""
@functools.wraps(fun)
def wraps(x, y):
if not (x and y):
raise ParameterNotEmptyError("参数不能为空")
if len(x) != len(y):
raise CoordinateLengthNotEqualError("两个参数长度不一致")
return fun(x, y)
return wraps
[文档]def singleton(cls, *args, **kwargs):
"""单列模式修饰器"""
instances = {}
@functools.wraps(cls, *args, **kwargs)
def _singleton():
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return _singleton
[文档]def coroutine(func):
"""自动激活协程装饰器"""
@functools.wraps(func)
def warp(*args, **kwargs):
g = func(*args, **kwargs)
next(g)
return g
return warp
if __name__ == '__main__':
from jtyoui.regular import Non_Chinese
@replace_regular(' ', '')
def remove_blank(a, b):
print(a, b)
@replace_regular(Non_Chinese, '')
def remove_non_chinese(a, b):
print(a, b)
remove_blank('你好 吗?', b='我 很好!')
remove_non_chinese('你好#$%76#%吗wore?', b='我$%787word很好!')
@singleton
class A:
pass
a = A()
b = A()
print(id(a) == id(b)) # True
@coroutine
def receiver():
n = 0
while True:
n = yield n + n
print(receiver().send(10))