【问题标题】:PyContract check functions in an imported modulePyContract 检查导入模块中的函数
【发布时间】:2012-10-22 02:11:40
【问题描述】:

我正在使用PyContract(不是PyContracts)为我的遗传算法框架实现按合同设计。

主模块是GA.py,它从crossover.py调用一个函数(我们称之为foocross)。我已经为foocross 编写了前置条件和后置条件表达式。

现在,我希望在 GA.py 中运行 main 时检查这些条件。我在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:这对我来说是一个很难写的问题,因为我不得不删除很多代码(因为框架非常复杂),而且我是按合同设计的新手。所以如果我错过了一些有助于回答这个问题的信息,请询问,我很乐意提供更多信息:)

【问题讨论】:

    标签: python design-by-contract


    【解决方案1】:

    看着the example,您似乎只需要:

    # this needs to be there unconditionally.
    import contract
    contract.checkmod(__name__)
    
    if __name__ == '__main__':
       import doctest, GA
       doctest.testmod(GA)
    

    但是,下面的将不起作用(因为在import GAcontract.checkmod() 内部不会发生):

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

    【讨论】:

      【解决方案2】:

      还有另一种解决方案。对于大型代码库,编辑多个文件以启用/禁用每个模块的合同检查会很乏味。我能够从我的主模块调用所有合同检查,如下所示:

      #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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多