2013-02-27 3 views
1

이것이 속임수인지 아닌지 확실하지 않습니다. 여기 간다.Python에서 속성으로 중첩 된 함수

내가 좋아 보이는 몇 가지 파이썬 코드를 작성할 필요가 :

class TestClass: 
    def test_case(self): 
    def get_categories(self): 
     return [“abc”,”bcd”] 
    # do the test here 

을 한 후 모든 테스트 클래스, 모든 test_case 기능 부하 검사 테스트 엔진 클래스가 있고 각각 get_categories를 호출하기위한 있는지 확인하려면 테스트는 특정 실행에 대한 관심 그룹에 속합니다.

문제는 get_categories가 test_case의 속성으로 볼 수없는 것을, 나는 수동으로 만 무슨 일이 일어날 것이

class TestClass: 
    def test_case(self): 
    def get_categories(self): 
     return [“abc”,”bcd”] 
    # do the test here 
    test_case.get_categories = get_categories 

할당하는 경우에도 때 test_case 먼저 실행, 너무 늦게 나를 위해.

이 함수가 클래스에서 작동 할 수없는 이유는 (또는 필자가 함수 수준에서 사용할 수 있기를 원하는 이유) TestClass에 여러 테스트 사례가있을 수 있기 때문입니다. 이것은 이미 존재하는 테스트 인프라이며 카테고리 메커니즘이 작동하기 때문에 (중요도가 낮은 카테고리 - 범주 시나리오 제외) 계획에 다시 작성되지 않습니다.

언어 트릭은 대단히 감사하겠습니다.

답변

0

중첩 된 함수는 다른 모든 할당보다 특성이되지 않습니다. (! 및 이전 스타일 클래스를 사용)

나는이 지원되지 않는 경우 테스트 인프라가 몇 가지 심각하게 이상한 일을 의심하지만, 당신은이 작업을 수행 할 수 있습니다 :

class TestClass: 
    def test_case(self): 
     # ... 

    def _get_categories(self): 
     return [...] 
    test_case.get_categories = _get_categories 
    del _get_categories 

클래스 몸은 실행 코드입니다 다른 블록과 같습니다.

0

중첩 된 클래스가 필요합니다. 기능은 당신이하려고하는 일을하기위한 것이 아니므로 한 단계 올라야합니다. 함수 속성은 주로 마크 업으로 사용되지만 클래스는 원하는대로 지정할 수 있습니다. 당신이 TestCase()를 인스턴스화없이 사용할 수 있도록 내가 @classmethod을 사용

class TestClass(object): 
    class TestCase(object): 
     @classmethod 
     def get_categories(cls): 
      return ['abc', 'efg'] 

참고; test_case = TestCase()을 원한다면 수정하십시오.

+0

우아하고 깨끗하지만, 사소한 기능을 위해 이미 700 개의 테스트가있는 기존 인프라에 그처럼 큰 변화를주지 않을 것입니다. :) –