2

私の最近のプロジェクトでは、いくつかの値がしばしば誤解されるという問題があります。たとえば、2 つの波 (2 つの振幅と 2 つの位相シフトが必要) の合計として波を計算し、4 つのポイントでサンプリングします。これらの 4 つの値のタプルをさまざまな関数に渡しますが、サンプル ポイントの代わりに波のパラメーターを渡すという間違いを犯すことがあります。

すべての計算がエラーなしで機能するため、これらのエラーを見つけるのは困難ですが、このコンテキストでは値はまったく意味がないため、結果は間違っています。

私が今欲しいのは、ある種のセマンティック型です。1 つの関数がサンプル ポイントを返し、もう 1 つの関数がサンプル ポイントを待機すること、およびこの宣言と矛盾するようなことを行うとすぐにエラーが発生しないことを述べたいと思います。

Pythonでこれを行う方法はありますか?

4

2 に答える 2

5

同じ構造を持つさまざまな種類の情報を区別できるように、特定のデータ型を実装することをお勧めします。listたとえば、単純にサブクラス化し、関数内で実行時に型チェックを行うことができます。

class WaveParameter(list):
    pass

class Point(list):
    pass

# you can use them just like lists    
point = Point([1, 2, 3, 4])

wp = WaveParameter([5, 6])

# of course all methods from list are inherited
wp.append(7)
wp.append(8)

# let's check them
print(point)
print(wp)

# type checking examples
print isinstance(point, Point)
print isinstance(wp, Point)
print isinstance(point, WaveParameter)
print isinstance(wp, WaveParameter)

したがって、この種の型チェックを関数に含めて、正しい種類のデータが渡されたことを確認できます。

def example_function_with_waveparameter(data):
    if not isinstance(data, WaveParameter):
        log.error("received wrong parameter type (%s instead WaveParameter)" %
                  type(data))
    # and then do the stuff

または単にassert

def example_function_with_waveparameter(data):
    assert(isinstance(data, WaveParameter))
于 2013-09-30T07:53:17.627 に答える
2

Pyhon の「セマンティック型」の概念は a と呼ばれますclassが、前述のように、Python は動的に型付けされるため、タプルの代わりにカスタム クラスを使用してもコンパイル時エラーは発生しません。一方を他方の代わりに使用しようとすると失敗するように設計されています。

現在、クラスはデータだけでなく動作にも関係しているため、波形固有の計算を行う関数がある場合、これらの関数はおそらくWaveformクラスのメソッドになり、パーツのイデムになり、Point論理エラーを回避するにはこれで十分かもしれません「ポイント」タプルを期待する関数に「波形」タプルを渡すようなものです。

簡単に言うと、静的に型付けされた関数型言語が必要な場合、Python は適切なツールではありません (Haskell の方が適している可能性があります)。本当にPythonを使用したい/使用しなければならない場合は、タプルと関数の代わりにクラスとメソッドを使用してみてください。それでもコンパイル時に型エラーは検出されませんが、型エラーが少なくなり、これらの型エラーが発生する可能性があります間違った結果を生成する代わりに、実行時に検出されます。

于 2013-09-30T10:01:48.943 に答える