programing

목록의 예외를 처리하는 방법은 무엇입니까?

telecom 2023. 7. 9. 09:47
반응형

목록의 예외를 처리하는 방법은 무엇입니까?

저는 파이썬에서 각 반복이 예외를 던질 수 있는 목록 이해력을 가지고 있습니다.

를 들어, 제가 다음을 가지고 있다면,

eggs = (1,3,0,3,2)

[1/egg for egg in eggs]

제가 사겠습니다ZeroDivisionError세 번째 요소의 예외입니다.

이 예외를 처리하고 목록 이해를 계속 실행하려면 어떻게 해야 합니까?

제가 생각할 수 있는 유일한 방법은 도우미 기능을 사용하는 것입니다.

def spam(egg):
    try:
        return 1/egg
    except ZeroDivisionError:
        # handle division by zero error
        # leave empty for now
        pass

하지만 제가 보기에는 이것은 좀 거추장스러워 보입니다.

파이썬에서 이것을 하는 더 좋은 방법이 있습니까?

참고: 이것은 간단한 예입니다(위의 "를 들어" 참조). 실제 예제에는 컨텍스트가 필요하기 때문입니다.저는 오류 0으로 나눗셈을 피하는 것이 아니라 목록 이해에서 예외를 다루는 것에 관심이 있습니다.

이 질문이 꽤 오래되었다는 것을 알고 있지만, 이러한 종류의 것을 더 쉽게 만들 수 있는 일반적인 기능을 만들 수도 있습니다.

def catch(func, handle=lambda e : e, *args, **kwargs):
    try:
        return func(*args, **kwargs)
    except Exception as e:
        return handle(e)

그렇다면, 당신이 이해하는 바로는:

eggs = (1,3,0,3,2)
[catch(lambda : 1/egg) for egg in eggs]
[1, 0, ('integer division or modulo by zero'), 0, 0]

물론 기본 핸들 기능을 원하는 대로 설정할 수 있습니다(기본값으로 '없음'을 반환하는 것이 낫다고 가정).

참고: python 3에서, 나는 'handle' 인수 키워드만 만들고 인수 목록의 끝에 넣을 것입니다.이것은 캐치를 통해 실제로 지나가는 주장과 그런 것들을 훨씬 더 자연스럽게 만들 것입니다.

업데이트(9년 후...): Python 3의 경우 스위치를 의미합니다.*args그리고.handle핸들을 지정하지 않고 함수에 인수를 지정할 수 있습니다.약간의 편의성:

def catch(func, *args, handle=lambda e : e, **kwargs):
    try:
        return func(*args, **kwargs)
    except Exception as e:
        return handle(e)

이는 이해에 정의된 기능을 사용할 때 유용합니다.

from math import log    
eggs = [1,3,0,3,2]
[catch(log, egg) for egg in eggs]
[0.0, 1.0986122886681098, ValueError('math domain error'), 1.0986122886681098, 0.6931471805599453]

Python 2 버전 아래에서 우리는 전달해야 했습니다.handle이전에egg.

Python에는 예외를 무시할 수 있는(또는 예외의 경우 대체 값 &c를 반환할 수 있는) 내장식이 없으므로, 말 그대로 "목록 이해에서 예외를 처리"하는 것은 불가능합니다. 왜냐하면 목록 이해는 다른 식을 포함하는 것이기 때문입니다(즉, 문장 없음,문장만 예외를 탐지/수정/수정할 수 있습니다.

함수 호출은 표현식이며 함수 본문은 원하는 모든 문을 포함할 수 있으므로, 여러분이 알고 있듯이 예외가 발생하기 쉬운 하위 표현식의 평가를 함수에 위임하는 것이 실현 가능한 해결책 중 하나입니다(다른 방법은, 실현 가능한 경우, 다른 답변에서 제안한 대로, 예외를 유발할 수 있는 값에 대한 검사입니다).

"목록 이해에서 예외를 처리하는 방법"이라는 질문에 대한 올바른 응답은 모두 이 모든 진실의 일부를 표현하고 있습니다. 1) 문자 그대로, 즉 어휘적으로 이해 자체에서, 여러분은 할 수 없습니다. 2) 실질적으로, 작업을 함수에 위임하거나 오류가 발생하기 쉬운 값을 확인합니다.따라서 이것이 답이 아니라는 당신의 반복적인 주장은 근거가 없습니다.

사용할 수 있습니다.

[1/egg for egg in eggs if egg != 0]

이렇게 하면 0인 요소를 건너뛸 수 있습니다.

아니요, 더 좋은 방법은 없어요.대부분의 경우 피터처럼 회피책을 사용할 수 있습니다.

다른 옵션은 이해 관계를 사용하지 않는 것입니다.

eggs = (1,3,0,3,2)

result=[]
for egg in eggs:
    try:
        result.append(egg/0)
    except ZeroDivisionError:
        # handle division by zero error
        # leave empty for now
        pass

그것이 더 번거로운지 아닌지 결정하는 것은 당신에게 달려 있습니다.

첫 번째 질문을 하는 사람과 브라이언 헤드가 제안한 도우미 기능은 전혀 번거롭지 않고 좋다고 생각합니다.한에 만약 ▁one▁code▁function▁is▁a▁which▁if▁wants▁▁avoid▁to▁a모▁solution▁of▁line다▁a▁perfect를 피하고 싶다면 도우미 기능이 완벽한 해결책입니다.for루프입니다. 하지만 다음과 같이 수정합니다.

# A modified version of the helper function by the Question starter 
def spam(egg):
    try:
        return 1/egg, None
    except ZeroDivisionError as err:
        # handle division by zero error        
        return None, err

은 다음과 같습니다.[(1/1, None), (1/3, None), (None, ZeroDivisionError), (1/3, None), (1/2, None)]이 답변을 사용하면 원하는 방식으로 계속 진행할 수 있습니다.

대안:

def spam2(egg):
    try:
        return 1/egg 
    except ZeroDivisionError:
        # handle division by zero error        
        return ZeroDivisionError

예, 오류가 발생한 것이 아니라 반환되었습니다.

저는 이것에 대한 어떤 대답도 보지 못했습니다.그러나 이 예는 알려진 실패 사례에 대한 예외가 제기되는 것을 방지하는 한 가지 방법이 될 수 있습니다.

eggs = (1,3,0,3,2)
[1/egg if egg > 0 else None for egg in eggs]


Output: [1, 0, None, 0, 0]

생성기를 사용할 수 있습니다.

def invert(xs):
    for x in xs:
        try:
            yield x
        except:
            yield None

list(invert(eggs))

언급URL : https://stackoverflow.com/questions/1528237/how-to-handle-exceptions-in-a-list-comprehensions

반응형