2012-10-24 2 views
1

바라기를이 시리즈의 마지막 질문입니다. (요구 사항이 변경되지 않는 이상 제 프로젝트가 거의 끝났습니다).PyContract PostCondition 비 입력 매개 변수 변수 포함

저는 PyContract (PyContracts이 아님)을 사용하는 클래스 메소드에 대한 몇 가지 제약 조건을 작성하고 있습니다. 내 기능 중 하나에서 나는 불변성이있다. 그러나이 사후 조건을 구성하는 모든 변수가 함수에 대한 입력 매개 변수는 아닙니다. 일부는 함수 자체의 범위에 대한 변수입니다 (루프 카운터 등). 계약서의 사후 조항에서 어떻게 캡처 할 수 있습니까? PyContract 그것이 이름 garg5을 모르는 저를 말할 때

def foo(*args, **kwargs): 
    """ 
     pre: 
      # some preconditions 
     inv: 
      # something that's clearly false 
      1 == 2 
     post: 
      g < arg5 
    """ 

    arg1 = kwargs['arg1'] 
    arg2 = kwargs['arg2'] 
    arg3 = kwargs['arg3'] 
    arg4 = kwargs['arg4'] 
    arg5 = kwargs['arg5'] 

    g = 0 
    while g < arg5: 
     vars = generate_data(arg1) 
     best = max(arg2(var)for var in vars) 
     if best >= arg3: 
      return best 
     # do stuff 
     g += 1 

문제가 발생 : 여기

내가 함께 일한지 코드의 MWE입니다. 계약에서 arg5kwargs['arg5']으로 변경했지만 PyContract는 여전히 g이 무엇인지 모릅니다. 방법 /이 문제를 해결할 수 있을까요?

내가 오류는 다음과 같습니다 도움이되지 않습니다 또한 다음과 같이

Traceback (most recent call last): 
    File "/Users/ashwin/github/local/Genetic-Framework/Genetic-Framework/Genetic/GA.py", line 245, in <module> 
    answer = runTSPGA(*settings, **settings) 
    File "<string>", line 3, in __assert_runTSPGA_chk 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/contract.py", line 1135, in call_public_function_all 
    return _call_one_all(func, va, ka) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/contract.py", line 1321, in _call_one_all 
    func.__assert_post(old, result, *va, **ka) 
    File "<string>", line 4, in __assert_runTSPGA_post 
NameError: global name 'g' is not defined 

는 사후 선언에 g 추가 :

post[kwargs, g]: 

을 또한, 재미 그 불변 검사에 대한 코드 전혀 실행되지 않는 것 같습니다.

+0

질문에 축 어적 오류 메시지를 추가 할 수 있습니까? 컨텍스트에 도움이됩니다. –

+0

'kwagrs [ 'agr #']'는'kwargs [ 'arg #']'가 아니겠습니까? –

+0

@AdamEberlin : 예. 그것은 어리석은 오타입니다. – inspectorG4dget

답변

0

사후 조건은 함수 실행이 완료된 후에 실행됩니다. 즉, 스택 프레임 cont 기능 지역 주민 (예 : arg5g)은 더 이상 범위에 포함되지 않습니다.

계약을 구현하는 라이브러리의 경우 너무 놀랍지 않습니다. 전체 기능은 구현해야하는 인터페이스에 제약 조건을 선언하는 것이지만, 그렇지 않은 함수의 내부 상태를 확인하려는 것입니다. 반환 값에 표시됩니다. 당신이 앞으로 나아갈 수

두 가지 방법은 다음과 같습니다

  1. 이 기능을 사용하면 계약 확인하려는 상태를 반환합니다. 내부 상태가 함수의 인터페이스의 일부가 아니더라도 이것은 적절하지 않을 수 있습니다.

  2. assert 문 또는 루프 후 raise AssertionError("while loop should have returned early") 문과 같이 제약 조건을 적용하려면 PyContract 이외의 다른 것을 사용하십시오.

+0

invariants가 전혀 실행되지 않습니다. 나는 명백하게 틀린 불변의'1 == 2'의 예를 들어이를 증명했습니다. 사후 조건에 대해 이야기하고 있다면 당신이 말하는 것은 의미가 있습니다. – inspectorG4dget

+0

질문은 사후 조건에 관한 것이 었으므로 그것이 제가 대답했습니다. 불변 식에 대한 부록에서 PyContract 문서는 불변량 w.r.t 만 언급합니다. 모듈 및 클래스. 함수에서 구문을 지원해야합니까? 그렇다면 사전 조건과 사후 조건이 제공하지 못할 것으로 예상되는 것은 무엇입니까? –

+0

무슨 뜻인지 알 겠어. 나는 invariants, 유전자 알고리즘을 실행하는 특정 변수를 확인하고 싶습니다. invariants가 올바르게 작동하도록 클래스로 마무리해야 할 것입니다. – inspectorG4dget

관련 문제