2017-06-19 6 views
0

3.5で名前付きタプルのカスタムオーバーロードをプラスに作成するにはどうすればよいですか?私はこれに3.6の新しい構文があることを知っています。あなたは3.5でそれを行うことができますか?私はそれがまたmypyの小切手を渡すことを望む。また、あなたが含まれているために起こるノート、何のPython 3.6で入力したnamedtuplesを定義するための新しい、クラスベースの構文は最終的に、実行時にやっていることは基本的にカスタムクラスを作成するメタプログラミングhijinkeryの束である、としてNamedTupleに `+`をオーバーロードする方法

from typing import NamedTuple 


Point = NamedTuple('Point',[('x',int), 
          ('y',int)]) 

def joinPoints(a: Point, b:Point) -> Point: 
    return Point(x = a.x+b.x,y=a.y+b.y) 

q = Point(1,2) 
r = Point(3,4) 
s= joinPoints(q,r) 
t = q+r #HOW DO I MAKE THIS GO? 
#s should equal t 
+3

どのような新しい構文を指していますか?あなたは名前付きタプルをサブクラス化して '__add__'をオーバーライドする必要があります –

+3

' __add__'を定義するためにサブクラスを作成する必要があります – theWanderer4865

+0

サブクラスを必要としません、機能型言語のようなtrait/type-basedディスパッチが必要です: – Carbon

答えて

1

カスタム__add__メソッド(含まれている場合)。

私たちはPython 3.5でその構文を使うことができないので、あなたが本当にやることができるのは、自分自身の定型文をすべて実装することです。

名前付きタプルは、基本的に単純なクラス(そのサブクラスタプル)を定義する便利な方法であることを意味することに注意してください。より複雑なものが必要な場合は、実際に実装する必要があります。いずれの場合においても


、完全なタイプを脇に設定し、あなたがランタイムで何をしようとしてやってのスーパークリーンな方法はありません、はるかに少ないの最高の種類(少なくとも、と私の知識)。私はあなたがそうのように、それを定義した後、クリーンな方法の1種の手動Pointクラスにパッチを適用することです推測:

from typing import NamedTuple 

Point = NamedTuple('Point', [('x', int), ('y', int)]) 

def add(self: Point, other: Point) -> Point: 
    return Point(self.x + other.x, self.y + other.y) 

Point.__add__ = add 

a = Point(1, 2) 
b = Point(3, 4) 

print(a + b) # prints 'Point(4, 6)' 

しかし、あなたはその後、mypyを使用して放棄する必要があるだろう - mypyは(単純化しますクラスの属性と型シグネチャは、そのクラスが定義された後も変更されないので、新しいメソッドをPointに割り当てることができなくなり、その結果、最後の行にエラーがスローされます。

おそらく、あなた、Pythonランタイム、およびmypyを満たす最終的なアプローチ(おそらくabcモジュールを使用していますか?)がありますが、私は現在そのようなアプローチを認識していません。

関連する問題