您可以创建一个工厂函数,从原始函数构建这些函数。它必须检查 in_place 关键字参数,决定将哪个目标用于绘制函数,然后调用它(原始参数减去 in_place)。
可能是:
def extend(draw):
def extended(img, *args, **kwargs):
# Default value for 'in_place': False
# You can change it to True if you prefer
in_place = kwargs.pop('in_place', False)
if in_place:
target = img
else:
target = img.copy()
draw(target, *args, **kwargs)
return target
return extended
一些使用示例(为了清楚起见,我使用列表而不是图像):
我们的绘图函数:
def draw1(lst, color):
lst.extend(['draw1', color])
def draw2(lst, shape, color):
lst.extend(['draw2', shape, color])
我们使用以下方法创建扩展函数:
extended_draw1 = extend(draw1)
extended_draw2 = extend(draw2)
如果我们在没有in_place 参数的情况下调用它们,请使用默认值(这里是False,我们在副本上绘制)
orig = ['Hello']
out = extended_draw1(orig, 'red')
print(out)
# ['Hello', 'draw1', 'red']
print(orig)
# ['Hello']
如果 in_place 为False,则返回修改后的副本,原件不变
orig = ['Hello']
out = extended_draw1(orig, 'red', in_place=False) # won't change the original
print(out)
# ['Hello', 'draw1', 'red']
print(orig)
# ['Hello']
如果in_place为True,则修改原来的
orig = ['Hello']
out = extended_draw1(orig, 'red', in_place=True) # won't change the original
print(out)
# ['Hello', 'draw1', 'red']
print(orig)
# ['Hello', 'draw1', 'red']
更多,使用第二个函数:
print(extended_draw2(orig, 'square', 'blue'))
#['Hello', 'draw1', 'red', 'draw2', 'square', 'blue']
print(orig)
#['Hello', 'draw1', 'red']
print(extended_draw2(orig, 'square', 'blue', in_place=True))
#['Hello', 'draw1', 'red', 'draw2', 'square', 'blue']
print(orig)
#['Hello', 'draw1', 'red', 'draw2', 'square', 'blue']