파이썬에서 EAFP 원칙은 무엇입니까?


답변:


216

로부터 용어집 :

허가보다 용서를 구하는 것이 더 쉽습니다. 이 일반적인 Python 코딩 스타일은 유효한 키 또는 속성이 있다고 가정하고 가정이 거짓으로 판명되면 예외를 포착합니다. 이 깨끗하고 빠른 스타일은 많은 사람들의 존재에 의해 특징 tryexcept문. 이 기술 은 C와 같은 다른 많은 언어에 공통적 인 LBYL 스타일 과 대조 됩니다.

사전 키에 액세스하려는 시도가 그 예입니다.

EAFP :

try:
    x = my_dict["key"]
except KeyError:
    # handle missing key

LBYL :

if "key" in my_dict:
    x = my_dict["key"]
else:
    # handle missing key

LBYL 버전은 사전 내부의 키를 두 번 검색해야하며 읽기가 다소 어려울 수도 있습니다.


34
또 다른 장점은 경쟁 조건을 피하는 것입니다. 예를 들어 파일을 열어 보면 얻을 수 있습니다. 얻을 수 있는지 확인한 다음 나중에 가져 와서 확인과 액세스 시도 사이의 짧은 시간에 더 오래 얻을 수 있음을 깨닫습니다.
Jon Clements

23
파이썬은 또한 핸들러 단지에 대한 기본 값을 할당하는 경우, 그 모두를 피할 수있는 방법을 제공 x키가 존재하지 않는 경우를 : x = mydict.get('key')리턴 None하는 경우 'key'에없는 my_dict; 당신은 또한 할 수있는 .get('key', <something>), 그리고 키가 사전에없는 경우 다음 X는 뭔가를 할당됩니다. dict.setdefault()collections.defaultdict뿐만 아니라 여분의 코드를 피하기위한 좋은 일입니다.
JAB

1
내 생각 except KeyError뿐만 아니라 같은 AttributeError단순하지만 최악의 사례 중 일부입니다. 그래서 except AttributeError잘못된 위치에 놓 였기 때문에 무언가 디버깅하는 것이 멈추었습니다. 내가 생각하는 더 좋은 예는 다음과 같습니다 try: open() ... except: IOError. 또는try: parseLine() ... except ParseError
스키

4
@ski 그것은 약간 다른 문제입니다. 당신은해야한다 항상 잘못된 예외를 잡기 피하기 위해 가능한 한 최소한으로 try 블록을 유지한다. 또한 일반적으로 EAFP 스타일을 선호하지 않습니다. 나는 여기서 질문에 대답하고 있으며, 어떤 사람들은 그것을 선호한다고 말합니다. 나는 어떤 코드가 나에게 가장 읽기 쉬운 것으로 보이는지를 사례별로 설명한다.
Sven Marnach

1
Grace Hopper 가 "Dare and Do."권한을 얻는 것보다 용서를 구하는 것이 더 쉽다 "(프로그래밍에만 국한되지 않음)는이 문구의 원천 이라고 언급 할 가치가 있다고 생각했습니다 .
Fabien Snauwaert

9

다른 예를 들어 설명하려고합니다.

여기서 우리는 파일에 액세스하고 콘솔에서 내용을 인쇄하려고합니다.

LBYL-당신이 도약하기 전에 살펴보십시오 :

파일에 액세스 할 수 있는지 확인하고 가능하면 파일을 열고 내용을 인쇄합니다. 파일에 액세스 할 수 없으면 그 else부분에 부딪 칩니다. 이것이 경쟁 조건 인 이유는 먼저 액세스 점검을하기 때문입니다. 도달 with open(my_file) as f:할 때까지 일부 권한 문제 (예 : 다른 프로세스가 독점 파일 잠금을 얻음)로 인해 더 이상 액세스 할 수 없습니다. 이 코드는 오류를 발생시킬 가능성이 높으며 파일에 액세스 할 수 있다고 생각했기 때문에 해당 오류를 잡을 수 없습니다.

import os

my_file = "/path/to/my/file.txt"

# Race condition
if os.access(my_file, os.R_OK):
    with open(my_file) as f:
        print(f.read())
else:
    print("File can't be accessed")

EAFP-허가보다 용서를 구하기 쉽다 :

이 예에서는 파일을 열려고 시도 할 수 없으며 파일을 열 수 없으면을 (를) 처리합니다 IOError. 가능하면 파일을 열고 내용을 인쇄합니다. 그래서 우리는 무언가 를 요구하는 대신 그것을 시도 하고 있습니다. 작동하면 훌륭합니다! 그렇지 않으면 오류를 잡아서 처리합니다.

# # No race condition
try:
    f = open(my_file)
except IOError as e:
    print("File can't be accessed")
else:
    with f:
        print(f.read())

이것을 경쟁 조건으로 묘사하는 것이 옳지 않습니다. 파일에 액세스 할 수 있는지 여부
ds4940

3
@ ds4940 6 행과 7 행 사이에서 파일 접근성이 변경되면 파일이 액세스 가능한지 확인한 후 여는 것 사이의 경쟁 조건입니다.
Markus von Broady

@MarkusvonBroady는 경쟁 조건에서 다른 참가자의 예를 제공하기 위해 답변을 편집했습니다.
ds4940

6

"낙관적 프로그래밍"이라고합니다. 아이디어는 대부분 사람들이 올바른 일을 할 것이며 오류는 적어야한다는 것입니다. 먼저 "올바른 일"이 발생하도록 코드를 작성하고 그렇지 않은 경우 오류를 포착하십시오.

내 생각은 사용자가 실수를한다면 시간의 결과를 겪는 사람이어야한다는 것입니다. 올바른 방법으로 도구를 사용하는 사람들이 속속입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.