如何用复杂参数重新定义函数

2024-10-02 14:28:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Python中的svgwrite库,因为svg的y轴向下,而我发现向上更方便,所以我定义了一个函数YInvert,它为我实现了这个技巧。但是,每次使用svgwrite中的函数时都必须使用此函数,例如:

dwg.line((xI,YInvert(yI)), (xII,YInvert(yII)), stroke='blue', stroke_width=0.1)

然而,这是不舒服的。如何重新定义函数dwg.line(或者定义一些新函数LineNew)来自动包含YInvert?我希望论点的形式相同,我的意思是我可以使用:

dwg.line((xI,yI), (xII,yII), stroke='blue', stroke_width=0.1)

或者

LineNew((xI,yI), (xII,yII), stroke='blue', stroke_width=0.1)

我也使用例如

dwg.circle(center=(10,YInvert(10)), r=0.2, fill='black')

因此,我正在寻找适用于各种参数的方法,只需在正确的位置添加YInvert函数。你知道吗


Tags: 函数svgstroke定义linebluewidthsvgwrite
1条回答
网友
1楼 · 发布于 2024-10-02 14:28:04

这里有一个装饰方法。坐标检测不是很聪明,你可能想磨练一下:

from functools import wraps

def YInvert(Y): # just for demo
    return -Y

def invert_axis(f):
    @wraps(f)
    def g(*args, **kwds):
        args = list(args)
        for j, a in enumerate(args):
            if isinstance(a, tuple) and len(a) == 2:
                try:
                    args[j] = (a[0], YInvert(a[1]))
                except:
                    pass
        for k, v in kwds.items():
            if isinstance(v, tuple) and len(v) == 2:
                try:
                    kwds[k] = (v[0], YInvert(v[1]))
                except:
                    pass
        return f(*args, **kwds)
    return g

演示:

@invert_axis
def f(a, b, c, d=3):
    print(a, b, c, d)

f((1, 2), 3, (4, 5), d=(1, 2))
# (1, -2) 3 (4, -5) (1, -2)

这也可以应用于已定义的函数,如库函数:

f2 = invert_axis(f2)

相关问题 更多 >