2010-04-30 3 views
4

나는 기본적인 "우수 사례"파이썬 질문이 있습니다. StackOverflow의 답은이 질문과 관련이 있지만 이미 복잡한 예제에서 빠져 있거나 여러 요소가 포함되어 있습니다.기본 파이썬 : 예외 발생 및 지역 변수 범위/바인딩

이 코드를 감안할 때 :

#!/usr/bin/python 

def test_function(): 
    try: 
     a = str(5) 
     raise 
     b = str(6) 
    except: 
     print b 

test_function() 

피할 방지하는 가장 좋은 방법은 무엇입니까 "UnboundLocalError을 : 지역 변수 'B'할당하기 전에 참조"나는 예외 처리기에 들어갈거야?

파이썬은이 문제를 해결할 수있는 우아한 방법이 있습니까? 그렇지 않다면, 부끄러운 길은 어떨까요? 복잡한 함수에서 필자는 예를 들어 모든 디버그 정보를 출력하기 전에 모든 로컬 변수의 존재를 테스트하는 것을 피하는 것이 좋습니다.

+2

무엇을 처리 할 수를 사용하여 로컬 범위에 정의되어 있는지 확인 수 있을까? 'except' 절에 인쇄되는 내용은 무엇입니까? – SilentGhost

답변

1
def test_function(): 
    try: 
     a = str(5) 
     raise 
     b = str(6) 
    except: 
     print b 

b = str(6)가 실행되지 않습니다. 프로그램은 raise 바로 뒤에 try 블록을 종료합니다. except 블럭에 어떤 변수를 출력하고 싶다면, 예외를 발생시키기 전에 그것을 평가하고 던져 예외에 넣으십시오.

class MyException(Exception): 
    def __init__(self, var): 
     self.var = var 

def test_function(): 
    try: 
     a = str(5) 
     b = str(6) 
     raise MyException(b) 
    except MyException,e: 
     print e.var 
+1

'예외'를 ​​발생시키지 마십시오. 이 경우와 마찬가지로, 그것을 잡는 것은 제정신이 아닙니다. 위의 코드에서'str'을 섀도우하게 만들었다면'TypeError'를 캐치 할 것이고, 메모리를 다 써 버렸고이 객체들을 만들지 못했을 때'MemoryError'가 생길 것입니다. –

+0

예제에 동의하고 편집했습니다. – sastanin

6

당신은

a = None 
b = None  
try: 
    a = str(5) 
    raise 
    b = str(6) 
except: 
    print b 
8

Does python have an elegant way to handle this?

언 바운드 이름을 인쇄에서 예외를 방지하기 위해 try 블록의 외부에서 변수를 초기화 할 수 있습니다, 가장 우아한 방법을 인쇄 할 수 없습니다; 두 번째 가장 우아한 방법은 이름이 바운드되도록하는 것입니다. 함수의 시작 부분에 바인딩 (이 목적으로 자리 표시 자 None이 널리 사용됨).

try: print 'b is', b 
except NameError: print 'b is not bound' 

In a complicated function I'd prefer to avoid testing the existence of every local variable before I, for example, printed debug information about them

If not, what about an inelegant way?

은 단순하게 기능을 유지 (즉, 복잡하지은) 매우도 좋습니다. 호어는 (그의 튜링 수용 강연에서 "황제의 헌옷", this PDF에서 재판 예) 삼십년 전에 쓴 것처럼 : 단순 는 달성 및 유지

There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.

참으로 어려운 : 당신이 특정을 구현해야 주어진 총 기능 X의 경우 복잡한 잡동사니와 잡다한 조각들로 구성된 복잡한 클래스와 기능, "똑똑한"해킹, 복사하여 붙여 넣기 및 편집하는 a-bit 에피소드를 통해 복잡한 작업을하는 것이 가장 자연스러운 유혹입니다. "드라이브 바이 코딩"등.

그러나 기능을 "너무 간단하게 유지하려고 노력하는 것은 가치있는 노력입니다. 분명히 결함이 없다. " 함수를 완전히 단위 테스트하기가 어렵다면 너무 복잡합니다. 즉, 리팩터링하여 리팩토링하는 작업을 수행 할지라도 리팩토링합니다. (실제로 단위 테스트에 중점을 두는 것이 코드 품질에 도움이되는 방법 중 하나입니다. 모든 코드를 완벽하게 테스트 가능한 상태로 유지하기 위해 끊임없이 노력해야하므로 으로 간단하게 만들 수 있습니다.).