2014-02-27 2 views
0

일부 기계 학습 코드에서 작업 중이며 간단한 오타 때문에 약 6 시간이 손실되었습니다. 대신 정말 numpy에 익숙하지 않아요으로라이브러리를 포함한 파이썬 코드를 확인하는 방법은 무엇입니까?

numpy.empty([100,100]) 

numpy.empty(100,100) 

, 그래서 브래킷을 잊었 :

그것은이 있었다. 코드는 행복하게 번호를 집어 넣었고 결과를 디스크에 저장하기 직전에 그 줄에서 충돌했습니다.

그냥 원근감있게 물건을 넣으려면 셸의 원격 컴퓨터에서 코드를 작성해야하므로 IDE는 실제로 옵션이 아닙니다. 또한 나는 IDE가 이것을 잡을 수 있을지 의심 스럽다.

다음은 내가 이미 시도 내용은 다음과 같습니다

  1. pylint 실행 - 잘 pylint 좀 작동합니다. 오류 및 경고가 모두 해제 된 후에도 유용하게 보입니다. 그러나 pylint은 가져온 모듈에 심각한 문제가 있습니다. 에서 볼 수 있듯이 official bug tracker devs 그것에 대해 알고 있지만 그것에 대해 아무것도 할 수 없습니다. 제안 된 해결 방법이 있지만 전체 모듈을 무시하면 내 경우에는 도움이되지 않습니다.
  2. pychecker 실행 실수로 코드 스 니펫을 만들면 pychecker 오류 - 파이썬 인터프리터와 동일한 오류가 발생합니다. 그러나 실제 소스 파일 (~ 100 LOC)에서 pychecker을 실행하면 다른 오류 (사용되지 않은 변수, 사용하지 않은 가져 오기 등)가보고됩니다. 그러나 결함이있는 멍청한 줄은 건너 뛰었습니다.

마지막으로 pyflakes을 시도했지만 pychecker/pylint 콤보보다 검사가 덜합니다.

코드를 미리 확인할 수있는 확실한 방법이 있습니까? 실제로 그것을 실행하지 않고.

+0

스위치 : 그러나 적어도 나는 중간 결과를 복구 할 수 있습니다? –

+1

나는 이런 종류의 것에 pycharm을 사용한다. 이 경우 IDE는 "빈"을 클릭하고 소스 코드로 이동하여 왜 충돌 하는지를 보게됩니다. 그것은 그들의 최고의 기능입니다. – fceruti

+0

여기 파이썬 만 사용하는 일반적인 해결책은 보이지 않지만 이와 같은 일이 발생할 때 많은 시간을 낭비하지 않도록 계산의 중간 결과를 피클 할 수 있습니다. – nwk

답변

2

더 강력한 유형 확인을 사용하는 언어는 에서이 코드를에서 구할 수 있었지만 일반적인 오류는 아닙니다. 정적 유형 검사를 통과하는 방법에는 여러 가지가 있습니다. 그것을 실행하기 전에

  1. 테스트 작은 예에 (몇 초 또는 몇 분에서 실행되는)을 처음부터 끝까지 코드 : 당신은 시간이 오래 걸리는 계산을한다면, 다음과 같은 전략을 채택하는 것이 합리적이다 시간이 많이 걸리는 큰 데이터.

  2. 중간 결과가 계산의 적절한 지점에서 디스크의 파일에 저장되도록 구조를 장기간 계산합니다. 즉, 무언가가 깨지면 문제를 해결하고 마지막 저장 지점에서 계산을 다시 시작할 수 있습니다.

  3. 인터랙티브 인터프리터에서 코드를 실행하십시오. 따라서 예외가 발생하면 사후 테스트 디버깅 세션을 사용하여 데이터를 복구 할 수있는 대화 형 세션으로 되돌아갑니다.예를 들어, 내가 어떤 장기 실행 계산이 있다고 가정

    def work(A, C): 
        B = scipy.linalg.inv(A) # takes a long time when A is big 
        return B.dot(C) 
    

    나는 대화 형 인터프리터에서 이것을 실행하고 예외를 제기

    >>> D = work(A, C) 
    Traceback (most recent call last): 
        File "<stdin>", line 1, in <module> 
        File "q22080243.py", line 6, in work 
        return B.dot(C) 
    ValueError: matrices are not aligned 
    

    오! 나는 C을 옮기는 것을 잊었다! 다시 A의 반전을해야합니까? 아니 내가 pdb.pm 호출하는 경우 : 리스프는 달리, 이제

    >>> import pdb 
    >>> pdb.pm() 
    > q22080243.py(6)work() 
    -> return B.dot(C) 
    (Pdb) B 
    array([[-0.01129249, 0.06886091, ..., 0.08530621, -0.03698717], 
         [ 0.02586344, -0.04872148, ..., -0.04853373, 0.01089163], 
         ..., 
         [-0.11463087, 0.15048804, ..., 0.0722889 , -0.12388141], 
         [-0.00467437, -0.13650975, ..., -0.13894875, 0.02823997]]) 
    

    을, 난 그냥 옳은 일을 설정하고 실행을 계속할 수 없습니다. .... 정적 미리 컴파일 된 언어

    (Pdb) D = B.dot(C.T) 
    (Pdb) numpy.savetxt('result.txt', D) 
    
2

unit tests을 사용합니까? 실제로 더 좋은 방법은 없습니다.

관련 문제