2017-03-05 9 views
-1

Ich benutze die svgwrite Bibliothek in Python und, weil Svg Y-Achse nach unten gehen, während ich finde es bequemer, es nach oben zu haben, habe ich eine Funktion YInvert, die den Trick macht für mich. Allerdings habe ich diese Funktion nutzen, jedesmal wenn ich eine Funktion aus svgwrite verwenden, z.B .:Wie (Funktion) definieren Funktion mit komplexen Argument

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

Dies ist jedoch unbequem. Wie könnte ich die Funktion dwg.line neu definieren (oder eine neue Funktion definieren LineNew), um automatisch die YInvert? Ich möchte das Argument in der gleichen Form sein, damit meine ich, dass ich verwenden könnte:

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

oder

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

Ich benutze auch zum Beispiel

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

so Suche für etwas, das für eine Vielzahl von Argumenten gelten würde, fügen Sie einfach die YInvert Funktion an der richtigen Stelle (n).

+1

Was genau möchten Sie fragen? Wenn Sie eine Funktion schreiben möchten, die diese Methode umschließt und 'YInvert' anwendet, tun Sie das einfach. Oder schreiben Sie vielleicht eine 'invertAllY'-Methode, die eine Liste von (x, y) -Koordinaten aufnehmen und eine Liste von (x, y ') -Inversionen zurückgeben kann. – jonrsharpe

+0

Ich frage, wie man eine solche Funktion 'LineNew' schreibt, die den' YInvert' umschließt. Vor allem, wie kann ich verwalten, dass eine Funktion als Argument etwas in Klammern hat. Außerdem weiß ich nicht, wie man Argumente wie "stroke" und "fill" weitergibt. – fales

+0

Klingt so, als würden Sie viele Funktionen für bestimmte Parameter patchen. Möchten Sie eine allgemeine Lösung? –

Antwort

2

Hier ist ein Decorator Ansatz. Die Koordinatenerfassung ist nicht sehr klug, dann würden Sie wahrscheinlich, dass ein bisschen schärfen wollen:

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 

Demo:

@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) 

Dies kann auch schon wie Bibliotheksfunktionen definiert Funktionen angewendet werden:

f2 = invert_axis(f2) 
+0

Vielen Dank für Ihre freundliche Hilfe. – fales

+0

Gern geschehen. –

Verwandte Themen