2012-07-09 7 views
0

나는 파이썬 코드를 생성하고 실행하는 앱을 가지고있다.Python의 환경을 정리하는 방법

push = Writer.Push 
... 
def appPush(self): 
    push(self) 
    dumpRow(self) 
... 
Writer.Push=appPush 

그것은 내가 해결해야 레거시 코드의 :이 과정에서 그들은 두 번째 실행에서 오류를 만들 때 내가 취소하고 싶은 두 가지 방법 할당이있다. 이것을 두 번 이상 실행하면 Python은 재귀가 있음을 알립니다.
환경을 지울 방법을 찾고 있었지만 'os.system ('CLS ')'이 도움이되지 않았습니다. 과제를 어떻게 정리할 수 있습니까?
감사합니다.

편집 :
레거시 코드입니다. 아직 익숙하지 않습니다. 내 응용 프로그램은 일반적인 것들을 포함하는 파이썬 코드를 생성하고 (위의 비트처럼) 사용자 워크 플로를 파이썬으로 변환합니다. 사용자가 'appPush'호출을 끝내는 플로우를 작성하면 1 실행 후에 어플리케이션을 다시 시작해야합니다.
위의 코드 뒤에 내용을 추가 할 수 있습니다. 내가 찾고있는 것은 통역사의 환경을 그 과제에서 제거하는 방법입니다. 가능한가?

+1

콘솔을 지우시겠습니까? – SuperSaiyan

+0

화면이 선명하지 않아도됩니다. (많은 \ n 필요 없음). 나는 그 과제를 어떻게 든 되길 바란다. – Noich

+2

문제를 이해하는 데 더 많은 코드가 필요합니다. 'os.system ('cls')'는 당신이 원하는 것이 아닙니다. – cha0site

답변

2

그래, 네 문제가 뭔지 알아.

이 코드 : push 이제까지 appPush로 변경 한 경우

push = Writer.Push 
def appPush(self): 
    push(self) 
    dumpRow(self) 
Writer.Push=appPush 

무한 재귀를 야기.

def appPushCreator(func): 
    def appPush(self): 
     func(self) 
     dumpRow(self) 
    return appPush 

Writer.Push = appPushCreator(Writer.Push) 

이 다른 dumpRow 당신이 코드의 비트를 사용하는 모든 시간을 일에 대한 암시 적 의미를 유지하는 것입니다 : 당신이 그것을 바꿀 수있다, 그래서 만약 당신이 거기에 기본적으로 원하는 것은, 데코레이터이다.

깨진 비트 뒤에 코드 만 추가하여 오류를 해결할 수 있다고 생각하지 않습니다. '환경을 깨끗이'하고 원래의 Writer.Push을 되 찾을 수는 없습니다.

+0

이것은 내가 필요한 것 같아요, 고마워요! 지금 나는 그것을 완전히 이해할 수 있도록 몇 가지 문서를 파고 싶습니다. 어떤 추천? – Noich

+1

@ 노이치 : 이것은 실제로 파이썬의 어휘 클로저 정의로 약간의 미묘함으로 실행됩니다. 함수형 프로그래밍을 사용할 때 발생하는 일종의 재미이지만 부작용은 허용하지 않습니다. 그것은이 질문에 논의 : http://stackoverflow.com/questions/233673/lexical-closures-in-python – cha0site

1

이런 식으로 뭔가 작업을해야합니다 :

real_push = None 
if real_push is None: 
    real_push = push 
Writer.Push = real_push 
그것은 깨진 코드 앞에 코드를 넣어 더 잘 작동 할 수

: 당신은 즉 코드 나무 등을 만들기 위해 노력하고 기본적으로

real_push = None 
if real_push is None: 
    real_push = Writer.Push 
Writer.Push = real_push 

두 번 이상 실행하면 한 번 실행하는 것과 동일한 효과가 나타납니다.

0

Writer.Push은 바인딩되지 않은 방법으로 래핑되기 때문에 파이썬 2.x에서 Writer.Push is appPush을 테스트 할 수는 없지만 Writer.Push에서 속성에 액세스 할 수 있으며 원래 기능으로 이동합니다. 또한 테스트 할 원래 패치 기능이 없는지 여부는 중요하지 않음을 의미하는 속성을 사용하는 경우. 즉,이 일을해야 의미 : 당신이 코드가 두 번째로 실행하면 덮어 쓰기 방지하기 위해 if 내부 push에 할당을 이동하려는

def appPush(self): 
    push(self) 
    dumpRow(self) 
appPush.is_patch = True 
... 

if not hasattr(Writer.Push, 'is_patch'): 
    push = Writer.Push 
    Writer.Push=appPush 

참고.

관련 문제