2014-10-13 12 views
3

좀 파이썬 2.5 코드를 이해하기 위해 노력하고있어 나는이 패턴을 가로 질러 온 다음에 "상승"나는 몇 가지 간단한 조건문과 셸이를 테스트 시도는 조건문 (파이썬)

def __init__(self, matrix, top_buttons, side_buttons, config_button): 
     raise isinstance(matrix, ButtonMatrixElement) or AssertionError 
     raise matrix.width() == 8 and matrix.height() == 8 or AssertionError 
     raise isinstance(top_buttons, tuple) or AssertionError 
     raise len(top_buttons) == 8 or AssertionError 
     raise isinstance(side_buttons, tuple) or AssertionError 
     raise len(side_buttons) == 8 or AssertionError 
     raise isinstance(config_button, ButtonElement) or AssertionError 

이런 식으로 :

그래서이 테스트에서 판단 해 보니 적어도 내가 시도한 방법과 비교하면 부울 문을 제기 할 수 없습니다. 조건부 표현식을 올리는 것은 무엇을 의미하며 __init__ 함수에서 작동하지만 내 테스트 코드에서는 작동하지 않는 이유는 무엇입니까?

+3

그 패턴은 ** 전혀 의미가 없습니다. –

+0

'raise'-ing이있을 때 조건부를 사용하는 유일한 방법은 예를 들어. 'SomeError를 발생 시키면 elseError'가 발생하지만, 불필요하게 혼란스럽게 보입니다. – jonrsharpe

답변

8

코드는 말도 안되는 것으로, 발견 한대로 실패한 assert statement과 같은 것으로 보이지 않는 시도입니다.

그들이 기록해야하는 것입니다 :

assert isinstance(matrix, ButtonMatrixElement) 

등등은.

decompiled Ableton Live scripts을 발견했지만 디 컴파일 스크립트가 잘못된 파이썬 코드을 생성했습니다. assert에 대한 바이트 코드는이 (파이썬 2.5 바이트 코드)과 같습니다

>>> import dis 
>>> dis.dis(compile('''assert isinstance(matrix, ButtonMatrixElement)''', '<stdin>', 'exec')) 
    1   0 LOAD_NAME    0 (isinstance) 
       3 LOAD_NAME    1 (matrix) 
       6 LOAD_NAME    2 (ButtonMatrixElement) 
       9 CALL_FUNCTION   2 
      12 JUMP_IF_TRUE    7 (to 22) 
      15 POP_TOP    
      16 LOAD_GLOBAL    3 (AssertionError) 
      19 RAISE_VARARGS   1 
     >> 22 POP_TOP    
      23 LOAD_CONST    0 (None) 
      26 RETURN_VALUE   

를하고 자동화 된 프로세스가 변환 된 바이트 코드를 컴파일하는 데 사용 된 어떤 것처럼 보이는 코드에 당신이 볼이 아닌 것과 같은 assert을 인식하고 있습니다. isinstance() 호출이 True을 반환하는 경우 재 구축 코드를하지 않는 동안

참고 그러나 점프 명령 (인덱스 12, JUMP_IF_TRUE)는 과거RAISE_VARARGS 명령을 점프있다. 실제 raise ... or ... 문이 비교, 당신은 점프가 raise지나 가지 않습니다 알 수 있습니다 :

>>> dis.dis(compile('raise foo or bar', '<stdin>', 'exec')) 
    1   0 LOAD_NAME    0 (foo) 
       3 JUMP_IF_TRUE    4 (to 10) 
       6 POP_TOP    
       7 LOAD_NAME    1 (bar) 
     >> 10 RAISE_VARARGS   1 
      13 LOAD_CONST    0 (None) 
      16 RETURN_VALUE   

는 아마도 코드 생성기이 처리 단지 정교하지 않았다; orJUMP_IF_TRUE을 생성하고 오프셋을 올바르게 처리하지 않는다고 가정하면 오류가 어떻게 생성되었는지 확인할 수 있습니다.

+1

해당 코드의 작성자가'raise' 키워드가 어떻게 작동하는지 다시 정의 할 수 있습니까? 내가 의심 할 여지가있는 유일한 이유는이 프로그램이 실제로 작동한다는 것입니다.이것이 오류이고 어떤 이상하고 혼란스러운 코드 스타일이 계속 발생할 가능성이 없다면이 프로그램이 여전히 실행될 수 있으며 이것이 실행을 중단시키지 않는 오류 일 수 있습니까? –

+0

그 코드가 실제로 실행되고 있다는 것은 얼마나 확실합니까? 인터프리터 C 코드를 패치하고 다시 컴파일하지 않고도'raise'를 재정의 할 수 없기 때문입니다. –

+0

이 코드가 실제로 실행되고 아무 것도 예외를 발견하지 못하면 * 프로그램이 실제로 정지합니다. –

2

이전에 대답했기 때문에 이것은 파이썬 바이트 코드를 리버스 엔지니어링하는 과정에서 사용 된 디 컴파일러의 버그입니다.

https://github.com/frankebersoll/uncompyle2

상기의 버그가 수정되어야합니다 : 당신이 당신의 자신의 파일을 디 컴파일하려는 경우 스크립트의 다음 버전을 사용할 수 있습니다. MainSelectorComponent.pyc을이 버전으로 디 컴파일하면 다음과 같이 표시됩니다.

class MainSelectorComponent(ModeSelectorComponent): 
    """ Class that reassigns the button on the launchpad to different functions """ 

    def __init__(self, matrix, top_buttons, side_buttons, config_button): 
     assert isinstance(matrix, ButtonMatrixElement) 
     assert matrix.width() == 8 and matrix.height() == 8 
     assert isinstance(top_buttons, tuple) 
     assert len(top_buttons) == 8 
     assert isinstance(side_buttons, tuple) 
     assert len(side_buttons) == 8 
     assert isinstance(config_button, ButtonElement) 
+0

감사! Push 제어 스크립트와 함께 사용했습니다. – cce