2017-03-05 6 views
-1

私はPythonでsvgwriteライブラリを使用していますが、svgがy軸を下向きにしているので、上向きにする方が便利だと私は定義しましたYInvert私のために。しかし、私は例えば、私がsvgwriteから関数を使用するたびに、この機能を使用する必要があります。:複雑な引数を使って関数を定義する方法

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

しかし、これは不快です。 YInvertを自動的に含めるには、関数dwg.lineを再定義するか(または新しい関数LineNewを定義する)ことができますか?私はこれで私が使用することができますを意味し、引数は同じ形であることにしたい:

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関数を追加するだけで、多種多様な議論に適用されることがあります。

+1

正確に何を求めようとしていますか?もしそのメソッドをラップして 'YInvert'を適用する関数を書こうとするならば、それをしてください。あるいは、おそらく、(x、y)座標のリストを取り、(x、y ')逆転のリストを返す 'invertAllY'メソッドを記述してください。 – jonrsharpe

+0

私は 'YInvert'をラップするそのような関数' LineNew'を書く方法を尋ねています。特に、関数が引数として括弧内に何かを持っていることをどうやって管理できますか?さらに、私は 'ストローク'や 'フィル'のような議論をどのように伝えるべきかわかりません。 – fales

+0

特定のパラメータに対して多くの関数をパッチしたいと思うように聞こえます。一般的な解決策が必要ですか? –

答えて

2

デコレータアプローチです。座標検出あなたはおそらくそのビットに磨きをかけたいと思い、非常にスマートではありません。

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) 
+0

ご親切なご協力ありがとうございます。 – fales

+0

あなたは大歓迎です。 –

関連する問題