2017-05-18 10 views
3

私はベクトル計算ライブラリをtranscryptに移植しようとしていましたが、繰り返し可能な型をエミュレートする問題にぶつかりました。トランスクリプトの反復可能なエミュレーション

私はVectorクラスに内部イテラブルを持っています。あなたが期待よう

class Vector: 
    def __init__(self, *values): 
     self.values = values 

    def __iter__(self): 
     for item in self.values: 
      yield item 

    def __add__(self, other): 
     return Vector(*(x + y for x, y in zip(self, other))) 

純粋なPythonで(Vector(1,2,3) + Vector(3,4,5))戻りVector(4,6,8):ここではコアの簡易版です。しかし、トランスコーディングの後、同じコードが失敗します.Javascriptでは、zip()はiterableオブジェクトのJavascript map()関数を期待しているようです。

私は明示的基盤となるストレージ、標的化することによって、このような場合には、それを回避することができます - それは*引数で作成されていますので、 - 必要な方法があるようです:

def __add__(self, other): 
    pairwise = zip(self.values, other.values) 
    return Vector(*(itertools.starmap(lambda a, b: a + b, pairwise))) 

をこれだけにそれを結合させます内部のコンテナは私に不快感を与えています。イテレータとスタルマップを作成するためのオーバーヘッドを想定しています。

これを回避するには適切な方法はありますか?クラスにmap()を追加できますか?もしそうなら、正しい署名は何ですか?基礎となるJSは、JSスコープの動作に依存しているようです...私を恐れている...

答えて

0

要点は、zipはイテレータにはまだ適合していません。 簡単な回避策は、zipのargsをリストに変換することです。 次のコードは動作します:

class Vector: 
    def __init__(self, *values): 
     self.values = values 

    def __iter__(self): 
     for item in self.values: 
      yield item 

    def __add__(self, other): 
     return Vector(*(x + y for x, y in zip(list (self), list (other)))) 

    def __str__ (self): 
     return self.values 

#__pragma__ ('opov') 

print (Vector(1,2,3) + Vector(3,4,5)) 

#__pragma__ ('noopov') 

これを印刷します:

4,6,8 
後半に答えて申し訳ありません

を、少し薄く過去数ヶ月普及しています。 イテレーターのためのzipの適応私はかなり複雑であることが分かったので、まだ完了していません。

paramsをリストに変換することは、自動的に行うことができます。 ランタイムテストによるオーバーヘッドが(小さな)オーバーヘッドにもかかわらず、予想される動作によく一致するため、これを追加します(問題#369)。

リリース3.6.44で、コードを変更せずに正しく動作させるようになりました(イテレータをアクティブにするには-e 6スイッチを使用)。

関連する問題