1

私はPyContract ( PyContractsではなく) を使用して、遺伝的アルゴリズム フレームワークの契約による設計を実装しています。

メインモジュールはGA.pyで、 から関数を呼び出しますcrossover.py( と呼びましょうfoocross)。の前提条件式と事後条件式を書きましたfoocross

mainさて、 GA.pyで実行するときにこれらの条件をチェックしたいと思います。foocrossコントラクトがチェックされているかどうかをテストするために誤った前提条件を導入しましたが、チェックされていないようです。契約がチェックされていることを確認するにはどうすればよいですか?

これが私のコードの最小限のセクションです:

# GA.py
def main():
    # some code
    crossover.foocross(params)
    # some more code

if __name__ == "__main__":
    main()

#crossover.py
def injectionco(p1, p2, chrom):
    """
        pre:
            isinstance(p1, int) # this should raise an error. p1 is never an int
            isinstance(p2, list)
            isinstance(chrom, int)
            forall(p1, lambda elem: any(isinstance(elem, i.__class__) for i in p2))
            forall(p2, lambda elem: any(isinstance(elem, i.__class__) for i in p1))
            len(p1) == len(p2)

        post:
            p1 is __old__.p1
            p2 is __old__.p2
            p1 == __old__.p1
            p2 == __old__.p2
            isinstance(__return__, p1.__class__)    # returns an individual
            len(__return__) == len(p1)
            id(__return__) not in [id(p1), id(p2)]
            forall(__return__, lambda elem: __return__.count(elem) == 1)
        """

    #code
    return #something

PS: これは私が書くのが非常に難しい質問でした。なぜなら、(フレームワークがかなり複雑なため) 多くのコードを取り除く必要があり、契約による設計は初めてだったからです。したがって、この質問に答えるのに役立つ情報を見逃していた場合は、お問い合わせください。喜んで詳細情報を提供します:)

4

2 に答える 2

0

別の解決策があります。大規模なコードベースの場合、各モジュールのコントラクトチェックを有効/無効にするためにいくつかのファイルを編集するのは面倒です。次のように、メインモジュールからすべてのコントラクトチェックを呼び出すことができました。

#GA.py

import crossover # and all other required modules
import contract

for mod in [crossover]: # put all other imported modules in that list
    contract.checkmod(mod)
于 2012-10-23T21:02:38.377 に答える
0

を見ると、あなたがする必要があるのは次のようです:

# this needs to be there unconditionally.
import contract
contract.checkmod(__name__)

if __name__ == '__main__':
   import doctest, GA
   doctest.testmod(GA)

ただし、以下は機能しません(内部import GAでは ,contract.checkmod()が発生しないため)。

if __name__ == '__main__':
   import contract
   contract.checkmod(__name__)
   import doctest, GA
   doctest.testmod(GA)
于 2012-10-22T05:30:51.270 に答える