0

これは私の前の質問のフォローアップです

私はPyContract ( PyContractsではありません) を使用して、クラス メソッドのいくつかの制約を作成する作業を行っています。id(myObj)事後条件として、一部のオブジェクトのメモリ アドレスが変更されていないこと、つまり、関数の呼び出しの前後で同じであることを確認したいと思います。PyContract でこれを行うにはどうすればよいですか?

これが私が今していることです:

def foo(param1, param2)
    """
        # some other constraints
        post[param1, param2]:
            __old__.param1 is param1
            __old__.param2 is param2
    """

ただし、その事後条件は失敗します。__old__.param1これは、が is と同じメモリ位置に格納されていないためだとしか思えませんparam1。これは理にかなっています。なぜなら、PyContractは実行後の値と比較してその値をチェックするために、実行param1前のコピーを作成する必要があるからです。fooparam1foo

上記の分析が正しいと仮定すると、id(__old__.param1)が と異なる理由を説明するだけid(param1)です。id(param1)ただし、の副作用として変更されないようにする方法については、まだ回答がありませんfoo。PyContract でこれを確認するにはどうすればよいですか?

4

1 に答える 1

1

私はあなたが使用しているPyContractライブラリに精通していませんが、関数の引数は参照によって渡されるため、テストしている実際のコントラクトはPythonではあまり意味がありません。次のようなコードがある場合:

x = a
y = b
foo(x, y)

x次に、関数は、呼び出し元のスコープによって、および呼び出し元のスコープ内で指定されたオブジェクトへの参照を受け取りますy。関数呼び出し内には、これらの引数への参照で初期化された2つの別個の変数があります。

したがって、関数内のこれらの変数への変更は、呼び出し元スコープのバインドxおよびy呼び出し元スコープ内のバインドに影響を与えることはできません。

于 2012-10-23T08:42:59.353 に答える