2014-10-20 1 views
2

내부적으로 사용되는 일련의 파이썬 모듈을 작성하고 있습니다. 내가 필요한 미묘하게 다른 매개 변수 유형을 전달하는 사용자가있는 문제.함수 시작시 유형 기능 확인

예를 들어 무언가가리스트리스트를 기대하고 튜플의리스트가 주어진다면, 함수가리스트의 일부 요소에 할당하려고 시도 할 때까지 대부분 시간이 걸릴 것입니다 .

내가 겪고있는 문제는 기능이 잘못되기 시작하는 지점에 기능이 도달하는 데 오랜 시간이 걸리고 때로는 모든 것을 처음부터 다시 시작해야한다는 것입니다. 나는 그것이 하나

  1. 비싼 경우 x[0][0]=null 또는 x.myfunc(a,b) 같은 것이 작동하는지 위의

같은

  • 가지고 부작용, 그리고 빨리 실패를 얻기 위해 테스트 할 수 있습니다 방법

    (실패 할 경우). 그래서 isinstance() 코드 나 코드의 오리 타이핑 특성을 유지하려는

    참고가 작동하지 않습니다 (또는 적어도 내가 볼 수없는 방법) 반드시 항상 경우 의미

  • +0

    부작용은 테스트하기가 쉽지 않으므로 대부분 부작용이 없을 때까지 코드를 리펙토링합니다. 그 외에, 당신은 근본적으로 중단 문제를 해결하려고 노력하고 있습니다, 그래서 나는 그것에 너무 많은 지력을 사용하지 않을 것입니다; 가능한 한 깔끔하게 API를 작성하고 우리 모두가 성인에 동의한다는 사실에 의존하십시오. – roippi

    +0

    @roippi ?? 나는'x.myfunc (a, b)'가 컴파일됩니다. 나는'myfunc'가 부작용이있을 것이라는 것을 알고 있습니다. 확실히 그 멈추지 않는 문제는 ... – soandos

    답변

    0

    오리 입력하지 않는 그것은 오리처럼 걷고, 오리처럼 취급하고, 나중에 돌팔이 있는지 확인하십시오. 그런 식으로하면 괜찮 으면 좋겠지 만 충분히 빨리 실패하지는 않습니다.

    foo을 작성한 경우 foo과 동일한 인수를 사용하지만 인수를 확인하고 약간만 수행하고 변경하지 않은 채로 남겨 두려고 시도하는 foo_check을 작성하십시오. foo이 충돌하면 foo_check도 충돌 할 수 있도록 시도하십시오. foo_check이 같은 것들을 할 수있다 : 기본적으로

    temp = x[0][0] 
    x[0][0] = temp 
    x[0].append('xxx') 
    x[0].pop() 
    

    을, 구문 인수로 않습니다 어떤 foo는, foo_check 한 번해야한다 (그리고 해당되는 경우, 다시 취소). 객체가 문자열인지 목록인지 확인해야 할 수도 있습니다. 이렇게하려면 잘못된 유형을 지정하면 충돌이 발생하는 foo을 수행하십시오.

    foobar으로 전화 한 경우 foo_check으로 전화하면 bar_check이됩니다. foo의 이름을 foo_optimized으로 변경하고 사용자에게 foo_checkfoo_optimized이라는 새로운 foo을 제공하십시오.

    문서에 넣습니다. "당신의 객체 xmyfunc이라는 두 개의 인수를 취해야합니다.이 인수는 x.myfunc(-1, [])이라고 불릴 때 오류없이 실행되지만 아무것도 수행하지 않습니다." 대부분의 사용자가 자연스럽게 그러한 방식으로 작동하는 함수를 제공 할 수 있도록 null 인수를 선택하십시오. 그런 다음 foo_checkx.myfunc(-1, [])을 호출 할 수 있으므로 두 개의 인수를 사용하여 호출 할 때 x.myfunc을 컴파일 할 수 있는지 여부는 최소한 알 수 있습니다.