私のプログラミング経験の大部分はC++でした。ここでのBjarneStroustrupの講演に触発されて、私のお気に入りのプログラミング手法の1つは「タイプリッチ」プログラミングです。機能を型にラップすることによって記述しなければならないコードの量を減らすだけでなく、新しい堅牢なデータ型の開発(たとえば、newVec.x = vec1.x + vec2.x;newVec.yの代わりにベクトルの追加) = ...など、newVec = vec1 + vec2)を使用できますが、強力な型システムを使用したコンパイル時にコードの問題も明らかになります。
私がPython2.7で行った最近のプロジェクトでは、上限と下限を持つ整数値が必要です。私の最初の本能は、Pythonの通常の数値とすべて同じ動作をするが、常にその(動的)境界値内にある新しいデータ型(クラス)を作成することです。
class BoundInt:
def __init__(self, target = 0, low = 0, high = 1):
self.lowerLimit = low
self.upperLimit = high
self._value = target
self._balance()
def _balance(self):
if (self._value > self.upperLimit):
self._value = self.upperLimit
elif (self._value < self.lowerLimit):
self._value = self.lowerLimit
self._value = int(round(self._value))
def value(self):
self._balance()
return self._value
def set(self, target):
self._value = target
self._balance()
def __str__(self):
return str(self._value)
これは良いスタートですが、そのようにこれらのBoundIntタイプの肉にアクセスする必要があります
x = BoundInt()
y = 4
x.set(y) #it would be nicer to do something like x = y
print y #prints "4"
print x #prints "1"
z = 2 + x.value() #again, it would be nicer to do z = 2 + x
print z #prints "3"
多数のPythonの「マジックメソッド」定義をクラスに追加して、さらにいくつかの機能を追加できます。
def __add__(self, other):
return self._value + other
def __sub__(self, other):
return self._value - other
def __mul__(self, other):
return self._value * other
def __div__(self, other):
return self._value / other
def __pow__(self, power):
return self._value**power
def __radd__(self, other):
return self._value + other
#etc etc
現在、コードのサイズは急速に拡大しており、記述されている内容が何度も繰り返されていますが、ほとんど返されませんが、これはまったくPythonのようには見えません。
通常のPython番号(整数?)や他のBoundIntオブジェクトからBoundIntオブジェクトを作成したい場合、事態はさらに複雑になります。
x = BoundInt()
y = BoundInt(x)
z = BoundInt(4)
私の知る限り、Pythonは(cスタイル)オーバーロードをサポートしていないため、BoundInt()コンストラクター内でかなり大きい/醜いif/else型チェックステートメントを使用する必要があります。
これらはすべて、Pythonでc ++コードを書き込もうとしているように感じます。これは、私のお気に入りの本の1つであるCodeComplete2が真剣に受け止められた場合の重大な罪です。動的型付けの流れに逆らって泳いでいるような気がします。
私はPythonの「pythonic-ally」のコーディングを学びたいと思っています。この種の問題ドメインにアプローチするための最良の方法は何ですか?適切なpythonicスタイルを学ぶための良いリソースは何ですか?