목록의 예외를 처리하는 방법은 무엇입니까?
저는 파이썬에서 각 반복이 예외를 던질 수 있는 목록 이해력을 가지고 있습니다.
예를 들어, 제가 다음을 가지고 있다면,
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
'programing' 카테고리의 다른 글
R을 다시 시작하지 않고 패키지를 언로드하는 방법 (0) | 2023.07.09 |
---|---|
PLSQL - 사용자의 모든 데이터베이스 개체 삭제 (0) | 2023.07.09 |
SpringBoot + ActiveMQ - 신뢰할 수 있는 패키지를 설정하는 방법 (0) | 2023.07.04 |
동일한 mongodb 쿼리에서 개수 및 고유 개수별 그룹화 선택 (0) | 2023.07.04 |
Visual Studio Code - 여전히 VS Code에 표시되는 GitHub에서 삭제된 분기를 제거하시겠습니까? (0) | 2023.07.04 |